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);
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 数据表搜索嵌套关系的主要内容,如果未能解决你的问题,请参考以下文章