小程府 2016-09-12 18:23:49 21644次浏览 3条评论 19 7 0

Yii2 中的 hasOne 与 hasMany 方法非常好用,但是,在联查的过程中如果要加条件,那改怎么办呢?
你可能说,我可以直接在后面跟 where 呀,比如这样:

public function getCanWeiList(){
    $tableAlias = Table::tableName();
    $where['status'] = 1;
    return $this->hasOne(Table::className(),['tableid'=>'id'])->where($where);
}

这样当然可以,但是如果这个条件是可变的,比如要加一个 $where['storeid'] = xx,那你怎么搞,在 getCanWeiList() 上面加参数,但是,在控制器中,这个方法是这样调用的,

$model = new ActiveDataProvider([
    'query' => Table::find()->where($where)->with('getCanWeiList')->orderBy('id desc'),
    'pagination' => [
        'pageSize' => 10,
    ],
]);

使用 with 调用的,你说怎么加条件,通过我深入进入 with 方法后发现,原来可以这样用:

Customer::find()->with([
    'orders' => function ($query) {
        $query->andWhere('status = 1');
    },
    'country',
])->all();

这样的话,条件就想怎么加,就怎么加了,上面的代码就可以改成

$model = new ActiveDataProvider([
    'query' => Table::find()->where($where)->with(
    [
        'tableType'=>function($query){
            $query->andWhere(['status'=>1,'storeid'=>$this->storeid]);
        },
    ]
    )->orderBy('id desc'),
    'pagination' => [
        'pageSize' => 10,
    ],
]);

是不是很简单!

觉得很赞
  • 评论于 2016-10-12 00:01 举报

    hanOnehasMany 可以指定查询吗 , 就是这张表里面的数据很多 并不需要 select *,可以直接在后面跟 ->select() 吗?

    4 条回复
    评论于 2016-10-13 09:20 回复

    当然可以呀!

    评论于 2016-10-18 14:44 回复

    想通过控制器传参数显示想要的字段用with查询怎么做

    评论于 2016-10-18 15:49 回复

    你可以 $query->andWhere('status = 1')->select(['id,'name'']) 这样试试

    评论于 2017-07-07 11:36 回复

    在后边加了select字段,关联表的需要的字段查不出来是怎么回事

  • 评论于 2016-12-29 09:13 举报

    不需要这么麻烦的,getCanWeiList()可以使用$model->canWeiList获取到关联表的所有数据,如果你想加where等条件的话,可以使用$query = $model->getCanWeiList(),这个得到的是一个ActiveQuery,你可以继续使用$query->where(['xxx'=>'xxx'])

    1 条回复
    评论于 2017-01-04 02:58 回复

    恩恩,好的,改天我试一下!

  • 评论于 2019-07-05 13:56 举报

    不错,解决了我的问题

您需要登录后才可以评论。登录 | 立即注册