假设现在有一个文章表article,一个分类表category,
一篇文章多个分类,绑定关系在分类表中
现需要一个文章列表,但是每篇文章的data里要包含他的全部分类信息,并且根据文章信息分页
肯定有一大部分人,会偷偷摸摸的先查出来所有文章再循环查询分类信息
类似这样
$list = $articlle->paginate(20);
foreach($list->items as $k => $v){
$list->items[$k] = $category->where('articleid',$v['id'])->select();
}
那这种情况,且不说执行速度的问题,如果查询条件有分类信息咋整,估计又要再循环一遍……
其实可以用TP自带的一个关联预加载功能,类似于先建立一个几个表联合的临时视图表,再对这个表处理
先建立模型
public function aaa(){
return $this->belongsTo('ABCModel', 'abc_id')->setEagerlyType(1); //一对一用这个
}
public function bbb(){
return $this->hasMany('DEFModel', 'def_id', 'id'); //一对多用这个
}
在程序中用with()加载模型后,就可以正常操作了
$data = $mod->with(['aaa','bbb'])
->field('a,b,c')
->paginate(20);
也可以
$data = $mod->with(['aaa' => function (Query $query) use ($info){
if (!empty($info['name'])) {
$query->where('name', '=', $info['name']);
}
},'bbb'])->where($where)->paginate(20);
最后结果就是类似这样
['文章1'=>['分类一','分类二'],'文章2']
网友评论