首页 > 解决方案 > 具有 3 组值的 Laravel Yajra Datatables 排序列

问题描述

我已经为所有评论成功实施了 yajra 数据表。一条评论可以有 3 种状态:ApprovedPendingBlocked

我在数据表上有一个名为的列Status,我想按状态对列进行排序。默认情况下,状态的范围是 perApprovedDeclined不是 for Pending

有什么办法可以让我通过在这 3 个状态上路由来对这一列进行排序?

我确定我的问题有一些editColumnfilterColumn方法,但我在任何地方都找不到。

为了@andrewjames 的快乐,我在这里添加了一些不必要的代码:

public function indexDataService()
{

    $reviews = DB::table('reviews')
                        ->join('users', 'reviews.user_id', '=', 'users.id')
                        ->join('statuses', 'reviews.status_id', '=', 'statuses.id')
                        ->join('products', 'reviews.product_id', 'products.id')
                        ->join('categories', 'reviews.category_id', 'categories.id')
                        ->select([
                            'reviews.*',
                            'reviews.created_at AS created_at', 
                            'statuses.title AS status',
                            DB::raw('CONCAT(users.first_name, "  ", users.last_name) AS full_name'),
                            'products.title',
                            DB::raw('categories.title as category'),
                        ])
                        ->where('reviews.deleted_at', '=', NULL);

    return Datatables::of($reviews)
                        ->addColumn('action', function($review){
                            return view('admin/reviews/reviews_actions', compact('review'));
                        })
                        ->editColumn('created_at', function ($review) {
                            $formatedDate = Carbon::createFromFormat('Y-m-d H:i:s', $review->created_at)->format('d-m-Y'); 
                            return $formatedDate;
                        })
                        ->filterColumn('full_name', function ($query, $keyword) {
                            $keywords = trim($keyword);
                            $query->whereRaw("CONCAT(first_name, last_name) like ?", ["%{$keywords}%"]);
                        })
                        ->filterColumn('category', function ($query, $keyword) {
                            $keywords = trim($keyword);
                            $query->whereRaw("categories.title like ?", ["%{$keywords}%"]);
                        })
                        ->make(true);
}

刀片上:

<script>

$('#category-reviews-table tfoot th').each( function () {
    var title = $(this).text();
    $(this).html( '<input type="text" placeholder="'+title+'" />' );
} );

$(function() {
$('#category-reviews-table').DataTable({
    "sDom":"ltipr",
    processing: false,
    serverSide: true,
    "language": {
            "url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Italian.json"
        },
    ajax: '{{ route('admin.reviews.data') }}',
    columnDefs: [
        {"className": "dt-center", "targets": "_all"},
        {   
        targets: [1],
        render: function ( data, type, row ) {
            return type === 'display' && data.length > 10 ?
                data.substr( 0, 20 ) +'…' :
                data;
            }
        }
    ],
    columns: [
        { data: 'full_name', name: 'full_name' },
        { data: 'title', name: 'products.title' },
        { data: 'category', name: 'category'},
        { data: 'no_yes', name: 'reviews.no_yes', searchable:false },
        { data: 'status', name: 'status', searchable:false, 
            render: function( data, type, full, meta ) {
                if (data === 'In attessa') {
                  return "<span class=\"badge badge-warning\">In attessa</span>";
                } else if (data === 'Approvata') {
                  return "<span class=\"badge badge-success\">Approvata</span>";
                } else if (data === 'Rifiutata') {
                return "<span class=\"badge badge-danger\">Rifiutata</span>";
                }
            }
        },
        { data: 'created_at', name: 'reviews.created_at', searchable:false  },
        { data: 'action', name: 'action', orderable: false, searchable:false }
    ],
    initComplete: function () {
        this.api().columns().every( function () {
            var that = this;

            $( 'input', this.footer() ).on( 'keyup change clear',        function () {
                if ( that.search() !== this.value ) {
                    that
                        .search( this.value )
                        .draw();
                }
            } );
        } );
    },
});
});

谁能给我一些例子如何实现它?

标签: laraveldatatablesrange

解决方案


推荐阅读