Laravel框架多表關聯查詢
一、Model關聯模型(關聯表--中間表),用反向關聯關係
//訂單記錄表
class XXXXAccess extends Model
{
//
use SoftDeletes;
protected $dates = ['deleted_at'];
//表1
public function YYYY(){
return $this->belongsTo('App\Models\YYYY','YYYY_id',id);
}
//表2
public function ZZZZ(){
return $this->belongsTo('App\Models\ZZZZ','ZZZZ_id','id');
}
//表3
public function HHHH(){
return $this->belongsTo('App\Models\HHHH','HHHH_id','id');
}
//更多表。。。
public function 方法名(){
return $this->belongsTo('App\Models\模型名','ZZZZ_id','id');
}
}
二、Controller控制器裏面的查詢(並添加where條件)
$list=XXXXAccess::with([
'YYYY'=>function($query){
return $query->where('title', 'like', '%first%');
},
'ZZZZ'=>function($query){
return $query->where('title', 'like', '%first%');
},
'模型定義的方法名'=>function($query){
return $query->where('title', 'like', '%first%');
}
])->get();
如果使用外面的條件變量,則要使用如下
$list=XXXXAccess::with([
'YYYY'=>function($query) use ($條件變量){
return $query->where($條件變量);
},
'ZZZZ'=>function($query) use ($條件變量){
return $query->where($條件變量);
},
'模型定義的方法名'=>function($query){
return $query->where($條件變量);
}
])->get();
如果要對關聯的模型做條件查詢(文檔中有關聯的約束使用方法,跟join的結果一樣。)
$list=XXXXAccess::orWhereHas(
'YYYY',function($query) use ($YYYY_where){
if (!empty($YYYY_where)) {
return $query->where($YYYY_where['字段1'])
->orWhere($YYYY_where['字段2']);
}
})->orWhereHas(
'ZZZZ',function($query) use ($ZZZZ_where){
if(!empty($ZZZZ_where)){
return $query->where($ZZZZ_where['字段1'])
->orWhere($ZZZZ_where['字段2'])
->orWhere($ZZZZ_where['字段3'])
->orWhere($ZZZZ_where['字段N...']);
}
})
//註釋:這裏的with就不用再寫條件了,因爲前面的has、whereHas、orWhereHas已經對關聯的表做了條件篩選
->with(['YYYY','ZZZZ','模型定義的方法名'])
//使用whereBetween
->where(function ($query) use ($XXXXAccess_where){
if(!empty($XXXXAccess_where)){
return $query->whereBetween('created_at',[$XXXXAccess_where['時間值(格式跟created_at一樣是timestemp,"2019-03-01")'],$XXXXAccess_where['end_time']],'and',false);
}
})
//關係表(中間表)的條件
->orWhere(function ($query) use ($XXXXAccess_where){
if(!empty($XXXXAccess_where)){
return $query->orWhere($XXXXAccess_where['字段1'])->orWhere($XXXXAccess_where['字段2'])->orWhere($XXXXAccess_where['字段3'])->orWhere($XXXXAccess_where['字段4']);
}
})->orderBy('created_at','desc')
->get();
也可以用lefjoin()相連,查出id集合,再用with拿出數據
$res_ids=XXXXAccess::leftJoin('YYYY','XXXXAccess.YYYY_id','=', 'YYYY.id')
->leftJoin('ZZZZ','XXXXAccess.ZZZZ_id', '=','ZZZZ.id' )
->where(function ($query) use ($XXXXAccess_where){
if(!empty($XXXXAccess_where)){
return $query->whereBetween('XXXXAccess.created_at',[$XXXXAccess_where['start_time'],$XXXXAccess_where['end_time']]);
}
})
->orWhere(function($query) use ($_REQUEST['key_word']){
if(!empty($_REQUEST['key_word'])){
return $query->where('YYYY.字段3','like','%'.$_REQUEST['key_word'].'%')
->orWhere('YYYY.字段3','like','%'.$_REQUEST['key_word'].'%')
->orWhere('YYYY.字段3','like','%'.$_REQUEST['key_word'].'%')
->orWhere('YYYY.字段3','like','%'.$_REQUEST['key_word'].'%');
}
})
->orWhere(function($query) use ($_REQUEST['key_word']){
if(!empty($_REQUEST['key_word'])){
return $query->where('ZZZZ.字段2','like','%'.$_REQUEST['key_word'].'%')
->orWhere('ZZZZ.字段1','like','%'.$_REQUEST['key_word'].'%');
}
})
->pluck('XXXXAccess.id');
//使用with一次拿出數據
$list=XXXXAccess::with([
'YYYY',
'ZZZZ',
'模型定義的方法名'
])->whereIn('id',$res_ids)->get();
三、view前端模板變量輸出(可以在控制器自已打印輸入看)
<td>
{{$list['YYYY']['字段名']}}
</td>
<td>
{{$list['模型方法名']['字段名']}}
</td>
公衆號:
打賞碼: