Laravel 8 如何通过关联关系查询户主数据用于Datatable展示及搜索
实现方案(基于Laravel关联原生功能,无需手动写JOIN)
完全可以通过Laravel Eloquent自带的关联能力实现需求,不需要手动编写JOIN语句,操作步骤如下:
第一步:在Family模型中新增户主专属关联
给Family模型定义一个带约束的一对一关联,直接过滤出关系为Head的家庭成员:
// app/Models/Family.php public function head() { return $this->hasOne(FamilyMember::class, 'family_id') ->whereHas('familyrelationship', function ($query) { $query->where('name', 'Head'); }); }
第二步:查询数据时预加载关联避免N+1问题
查询Family数据时用with预加载head关联,减少数据库查询次数:
$families = Family::with('head')->select('families.*');
第三步:Datatable字段配置与搜索逻辑实现
这里以常用的yajra/laravel-datatables扩展包为例,配置字段展示与关联字段的搜索逻辑:
return datatables()->eloquent($families) // 追加户主姓名字段 ->addColumn('head_first_name', function ($family) { return $family->head?->first_name ?? ''; }) ->addColumn('head_last_name', function ($family) { return $family->head?->last_name ?? ''; }) // 给户主字段配置搜索逻辑 ->filterColumn('head_first_name', function ($query, $keyword) { $query->whereHas('head', function ($q) use ($keyword) { $q->where('first_name', 'like', "%{$keyword}%"); }); }) ->filterColumn('head_last_name', function ($query, $keyword) { $query->whereHas('head', function ($q) use ($keyword) { $q->where('last_name', 'like', "%{$keyword}%"); }); }) ->rawColumns(['head_first_name', 'head_last_name']) ->make(true);
前端Datatable列配置示例
$('#family-table').DataTable({ processing: true, serverSide: true, ajax: '你的接口地址', columns: [ {data: 'id', name: 'id'}, {data: 'address', name: 'address'}, {data: 'head_first_name', name: 'head_first_name'}, {data: 'head_last_name', name: 'head_last_name'}, ] });
注意事项
- 代码中用到的
?->是PHP7.4+支持的空安全运算符,如果你的PHP版本更低,可以替换为optional($family->head)->first_name ?? '' - 如果存在一户多个户主的业务场景,可将
hasOne关联改为hasMany,自行调整字段展示逻辑即可
内容的提问来源于stack exchange,提问作者Nausif
相关产品推荐
相关产品推荐

