【问题标题】:Laravel Datatables search on nested RelationshipLaravel 数据表搜索嵌套关系
【发布时间】:2017-12-13 02:22:48
【问题描述】:

我目前正在使用数据表 7.0 和 Laravel 5.4 我的网格中的数据显示正确,但是当我想搜索嵌套关系列时出现以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'course_semester.semester.name' in 'where clause' (SQL: select count(*) as aggregate from (select '1' as `row_count` from `videos` where LOWER(`videos`.`id`) LIKE %%te%% and LOWER(`videos`.`name`) LIKE %%te%% and LOWER(`course_semester`.`semester`.`name`) LIKE %%te%%) count_row_table)

这是我的代码

控制器

$videos = Video::with(['course_semester' => function ($query) {
            return $query->with('course', 'semester');
        }])->select('videos.*');
        return Datatables::of($videos)
                ->addColumn('check', '<input type="checkbox" name="selected-videos" value="{{$id}}">')
                ->escapeColumns([])
                ->make(true);

Javascript

columns: [
                 { data: 'check' , name: 'check',orderable: false, searchable: false },
                 { data: 'id', name: 'videos.id' },
                 { data: 'name', name: 'videos.name' },
                 { data: 'course_semester.semester.name', name: 'course_semester.semester.name'},
                 { data: 'course_semester.course.name', name: 'course_semester.course.name'},
                 { data: 'status', name: 'videos.status' },
                 { data: 'comment', name: 'videos.comment' },
                 { data: 'video_date', name: 'videos.video_date' },
            ]

谁能帮助我并注意到我的问题?

提前致谢。

【问题讨论】:

    标签: laravel datatables


    【解决方案1】:

    因为这里使用了select(),所以没有加载关系。另外,nested eager loading 使用点语法:

    $videos = Video::with(['course_semester', 'course_semester.course'])
    

    【讨论】:

    • 感谢您的回复,但 yajrabox 数据表文档显示 EloquentController.php - Eloquent Datatable with Eager Loading
    • @HamedYarandi 在文档中他们没有使用嵌套的急切加载,而你这样做了。
    • 根据你的建议,我得到了这个错误:No available engine for Illuminate\Database\Eloquent\Collection
    • @HamedYarandi 我没有使用 datatables 包,但看起来您需要删除 get() 部分。
    【解决方案2】:

    1-数据表函数

    public function dataTable($query)
    {
        return datatables()
            ->eloquent($query)
            ->addColumn('BulkSelection', function ($category) 
            {
            ->addColumn('company', function ($category) 
            {
                return $category->company ? $category->company->name : 'No Company';
            })
            ->rawColumns(['action', 'company', 'createdAt','BulkSelection']);
    }
    

    2-查询函数

        public function query(Category $model)
    {
            return $model->with('company:id,name')->select('categories.*')->newQuery();
    }
    

    3- getColumns函数

    $getCols = [
         
            'id',
            'name',
            'company'=> [
                'data'=>'company',
                'name'=>'company.name'
            ],
            'createdAt' => [
                'name'=>'created_at',
                'searchable' => false
            ],
            'action' => [
                'exportable' => false,
                'searchable'=>false,
                'orderable' => false
            ]
        ];
    
        return $getCols;
    

    【讨论】:

    • 为我工作谢谢!!!
    【解决方案3】:

    如果您只需要从关系表中加载数据,请使用以下代码

    $videos = Video::with('course_semester','course', 'semester')->select('videos.*');
            return Datatables::eloquent($videos)
                    ->addColumn('check', function(Video $v){ 
                      return '<input type="checkbox" name="selected-videos" value="{{$v->id}}">'
                      })
                    ->rawColumns(['check'])
                    ->make(true);
    

    在脚本中,您可以将关系值称为 ,

              {data: 'course_semester.id'},
              {data: 'course.name'},
              {data: 'semester.name'},
    

    【讨论】:

    • 但是这会返回列video.course如果没有找到相关的课程集合进行搜索
    【解决方案4】:
     $getCols = [
               
             
                'title',
                'Images' => [
                    'name'=>'images_count',
                    'data'=>'images_count',
                    'searchable'=>false
                ],
                'price' => ['name'=>'start_price', 'data'=>'start_price'],
                'reserve_price',
                'Category' => [
                    'data'=>'show_category',
                    'name'=>'categories.name',
                    'searchable'=>false
                ],
                'created_by' => [
                    'name'=>'user.name',
                ],
                'createdAt' => [
                    'name'=>'created_at',
                    'searchable' => false
                ],
                'action' => [
                    'exportable' => false,
                    'searchable'=>false,
                    'orderable' => false
                ]
    

    【讨论】:

    • 也许对你的回答建议有一些解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2019-11-23
    • 2022-08-09
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多