Laravel多表(3張表以上)with[]關聯查詢,對關聯的模型做條件查詢(has,跟join一樣結果 )

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>

 

 

公衆號:

打賞碼:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章