yii的多表联查、数据关联查询小结 [ 2.0 版本 ]
从thinkphp中转到yii,老想着用thinkphp中的方法,比如之前用的数据库联查,比如,菜品dish表中,有菜品分类cateid,菜品单位unitid,分类跟单位是单独的表,如何实现通过查询dish表,将分类表中catename、单位表中unitname,都查询出来呢,thinkph中,直接就上代码:
$this->dish->alias('d')->join('LEFT JOIN __CATEGORY__ c ON d.cateid=c.cateid')->where()->select();
今天看了一下yii,发现方法更简单,方法如下:
在dish模型中,定义一个方法,实现关联分类表:
public function getCate(){
/**
* 必须以get开头哦
* 第一个参数为要关联的字表模型类名称,
*第二个参数指定 通过子表的 cateid 去关联主表的 cateid 字段
*/
return $this->hasOne(Category::className(), ['cateid' => 'cateid']);
}
再定义一个方法,实现关联单位表:
public function getUnit(){
/**
* 第一个参数为要关联的字表模型类名称,
*第二个参数指定 通过子表的 id 去关联主表的 id 字段
*/
return $this->hasOne(Unot::className(), ['unitid' => 'unitid']);
}
然后,在dish控制器中,正常的查询dish表中的数据就ok了
public function actionIndex()
{
$count=$this->dish->find()->where($where)->count();
$page=new Pagination(['defaultPageSize'=>20,'totalCount'=>$count]);
$msgs=$this->dish->find()->where($where)->orderBy('dishid desc')->offset($page->offset)->limit($page->limit)->all();
return $this->render('index',['page'=>$page,'msgs'=>$msgs]);
}
重点在视图中的调用,这是foreach的,没有写全,只写了重点,unit、cate是之前在get后面的名字
<td><?=$v->unit->unitname?></td>
<td><?=$v->cate->catename?></td>
这样就搞定了,注:hasOne是一对一,如果是一个用户有多个订单要用hasMany,有错误,请大家指正哦!
小程府 北京
注册时间:2016-03-23
最后登录:2021-02-09
在线时长:30小时31分
最后登录:2021-02-09
在线时长:30小时31分
- 粉丝13
- 金钱255
- 威望100
- 积分1555
共 1 条评论
tp5也有关联模型,tp5的多对多关联是采用的join模型,因而可以直接搜索,而且还能得到中间表数据。yii2是分开查询的,不知道如何进行搜索,中间表数据也不知道怎么得到,求赐教