多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
![](https://img.kancloud.cn/0f/4f/0f4fac6107d695b52fd5fa018a647e4c_834x459.jpg) # 一、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(); ``` 还可以在模型中使用join,对于A.a=B.a,A.b=B.b这种多字段条件的情况 # 三、view前端模板变量输出(可以在控制器自已打印输入看) ``` <td> {{$list['YYYY']['字段名']}} </td> <td> {{$list['模型方法名']['字段名']}} </td> ```