以一对一为例,先说一下with如何使用
一、最简单的,直接model->with('details')->get();
只要在对应的model写上details方法
public function details() { return $this->hasOne('App\Models\Admin\Business','id'); }
这个表示当前model表数据每条的business_id对应Business表的id,即一对一的关系
二、如何用with带条件筛选呢 或者指定关联查询的字段呢
有两种方式,根据自己的需求选择
1. 不影响主表查询条数,只筛选关联表的查询结果
- $list = $this->ServiceModel->where($where)->with(['business' => function ($query) use ($name,$phone) {
- $where = [];
- if(!empty($name)){
- $where['name'] = $name;
- }
- if(!empty($phone)){
- $where['phone'] = $phone;
- }
- $query->where($where);
- $query->select('id', 'name', 'phone');
- }])->paginate($this->pageSize, ['*'], 'page', $page);
以上查询结果:列表总条数不变,但不满足条件的查询出来的business为null
如图所示
2. 可作为搜索,只查询满足条件的条数,不满足条件的关联主表也不查询出来
- $query = $this->ServiceModel->where($where);
- $query->with(['business' => function($query1){
- $query1->select('id', 'name', 'phone');
- }]);
- $query->whereHas('business', function (Builder $query2) use ($name,$phone) {
- $where = [];
- if(!empty($name)){
- $where['name'] = $name;
- }
- if(!empty($phone)){
- $where['phone'] = $phone;
- }
- $query2->where($where);
- });
- $list = $query->paginate($this->pageSize, ['*'], 'page', $page);
上面结果如图所示