【问题标题】:Yii2 viaTable join conditionYii2 viaTable 连接条件
【发布时间】:2014-12-01 14:26:49
【问题描述】:

是否可以在 viaTable 的 join 部分设置条件? 目前我得到了这个:

return $this->hasMany(User::className(), ['id' => 'id_user'])
                    ->from(User::tableName())
                    ->viaTable(RoomActiveUser::tableName(), ['id_room' => 'id'],
                        function($query) {
                        return $query->andWhere(['id_role' => 
                                 RoleHelper::getConsultantRole()->id]);
                    });

但这不是一个好的解决方案。为什么? 当您进行左连接时,id_role 条件实际上将使其成为内连接。 id_role 条件应放在连接的 ON 部分内。

我在网上搜索并检查代码,但我不知道如何解决。

【问题讨论】:

    标签: php mysql join activerecord yii2


    【解决方案1】:

    我从强雪那里得到了答案 - $query->onCondition() 应该用于我需要的东西。结果代码:

    return $this->hasMany(User::className(), ['id' => 'id_user'])
                        ->from(User::tableName())
                        ->viaTable(RoomActiveUser::tableName(), ['id_room' => 'id'], 
                            function($query) {
                              $query->onCondition(['id_role' => 
                                 RoleHelper::getConsultantRole()->id]);
                          });
    

    【讨论】:

      【解决方案2】:

      你有没有尝试过这样做

      ->viaTable(RoomActiveUser::tableName(), ['id_room' => 'id', 'id_role' => RoleHelper::getConsultantRole()->id])
      

      这应该创建一个JOIN X on 'id_room' = 'id' AND 'id_role' = '$ConsultantRole_id'

      【讨论】:

      • 不。它会告诉你没有列 id 或没有第 1 列(如果 id 为 1)。我从 Yii 的创始人薛强那里得到了答案。我会发布答案。
      • 是的,这听起来很对。我记得前段时间我也遇到过类似的问题。我最终通过创建参数关系来解决它。
      • 我认为这可以通过拆分条件并在viaTable语句之后使用来轻松解决 ->onCondition(['id_role' => RoleHelper::getConsultantRole()->id])
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多