Laravel 数据表搜索嵌套关系

Posted

技术标签:

【中文标题】Laravel 数据表搜索嵌套关系【英文标题】:Laravel Datatables search on nested Relationship 【发布时间】: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' ,
            ]

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

提前致谢。

【问题讨论】:

【参考方案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
            ]

【讨论】:

也许对你的回答建议有一些解释

以上是关于Laravel 数据表搜索嵌套关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中获取嵌套关系的数据

如何使用关系在laravel中的数据库中插入嵌套的二维数组

Laravel Eloquent:获取嵌套关系中的数据总和并将其添加为新属性

如何在 Laravel 中获取嵌套关系的实例?

Laravel:数据表搜索选项不使用关系表字段

laravel 7.14 在使用关系搜索数据表后为产品构建链接