小程府 2016-04-15 17:08:08 7612次浏览 1条评论 4 1 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,有错误,请大家指正哦!

觉得很赞
  • 评论于 2018-03-08 16:04 举报

    tp5也有关联模型,tp5的多对多关联是采用的join模型,因而可以直接搜索,而且还能得到中间表数据。yii2是分开查询的,不知道如何进行搜索,中间表数据也不知道怎么得到,求赐教

    , 觉得很赞
您需要登录后才可以评论。登录 | 立即注册