You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:45:00