Datatable.js - Laravel:JSON 列未过滤(可排序)

Datatable.js - Laravel: JSON columns are not filtered (orderable)

提问人:Raphael M 提问时间:11/17/2023 更新时间:11/17/2023 访问量:16

问:

我在 Mysql 数据库上使用 laravel 和包:yajra/laravel-datatables-oracle。我还使用 mcamara/laravel-localization 包来管理网站的不同语言。

下面的雄辩代码显示了一个数据表.js表:数据正确,搜索引擎工作。但是,我无法将订单应用于我的列。事实上,数据表允许您按升序/降序过滤列,但它不起作用。

我的字段中的数据:free_videos.title 和 categories.title 作为类别是 JSON 格式 ({“en”: “My title”, “fr”: “Mon titre”}。

我已经尝试了各个方向的filterColumn,但是当我单击相关列的标题时,我无法按升序或降序排列我的列:显示指示显示顺序更改的箭头并更改状态,但未过滤数据。

Laravel代码:

public function active(Request $request)
    {
        $query = FreeVideo::query()->leftJoin('categories', 'free_videos.category_id', '=', 'categories.id')->select('free_videos.id', 'free_videos.title', 'categories.id as category_id', 'categories.title as category');

        return DataTables::eloquent($query)
            ->addColumn('freeVideoTitle', function($row){
                return $row->title; //Json table default lang : "fr" provided ("mcamara/laravel-localization")
            })
            ->editColumn('freeVideoCategory', function($row)
            {
                $category = json_decode($row->category, true);
                return isset($category['fr']) ? $category['fr'] : '';
            })
            ->editColumn('languages', function($row){
                return $row->getTranslations('title');
            })
            ->addColumn('actions', function($row) use ($request){
                $actions['edit'] = ['status' => 1, 'route' => route('backend.freeVideos.edit', $row->id)];
                $actions['destroy'] = ['status' => 1, 'route' => route('backend.freeVideos.destroy', $row->id)];
                return $actions;
            })
            ->make(true);
    }

Javascript代码:

table.DataTable({
            language: {url: '/assets/common/js/locales/datatable/fr.json'},
            dom:
                "<'row'" +
                "<'col-sm-6 d-flex align-items-center justify-conten-start'l>" +
                "<'col-sm-6 d-flex align-items-center justify-content-end'f>" +
                ">" +

                "<'table-responsive'tr>" +

                "<'row'" +
                "<'col-sm-12 col-md-5 d-flex align-items-center justify-content-center justify-content-md-start'i>" +
                "<'col-sm-12 col-md-7 d-flex align-items-center justify-content-center justify-content-md-end'p>" +
                ">",
            responsive: true,
            searchDelay: 500,
            processing: true,
            serverSide: true,
            pageLength: 50,
            ajax: ajaxProcessing,
            columns: [
                {
                    data: 'freeVideoTitle',
                    name: 'free_videos.title'
                },
                {
                    data: 'freeVideoCategory',
                    name: 'categories.title'
                },
                {
                    data: 'languages',
                    name: 'langs'
                },
                {
                    data: 'actions',
                    responsivePriority: -1
                },
            ],
            order: [[0, 'desc']], ...
laravel 数据表 yajra-datatable

评论


答:

0赞 Raphael M 11/17/2023 #1

固定!

  1. $query => categories.title->fr 作为类别
  2. JS =>名称:“free_videos.title->fr”和名称:“categories.title->fr”
public function active(Request $request)
    {
        $query = FreeVideo::query()->leftJoin('categories', 'free_videos.category_id', '=', 'categories.id')->select('free_videos.id', 'free_videos.title', 'categories.id as category_id', 'categories.title->fr as category');

        return DataTables::eloquent($query)
            ->addColumn('freeVideoTitle', function($row){
                return $row->title;
            })
            ->addColumn('freeVideoCategory', function($row){
                return $row->category;
            })
            ->editColumn('languages', function($row){
                return $row->getTranslations('title');
            })
            ->addColumn('actions', function($row) use ($request){
                $actions['edit'] = ['status' => 1, 'route' => route('backend.freeVideos.edit', $row->id)];
                $actions['destroy'] = ['status' => 1, 'route' => route('backend.freeVideos.destroy', $row->id)];
                return $actions;
            })
            ->make(true);
    }
columns: [
                {
                    data: 'freeVideoTitle',
                    name: 'free_videos.title->fr'
                },
                {
                    data: 'freeVideoCategory',
                    name: 'categories.title->fr'
                },
                {
                    data: 'languages',
                    name: 'langs'
                },
                {
                    data: 'actions',
                    responsivePriority: -1
                },
            ],