【问题标题】:Yii2: ActiveQuery "with" not workingYii2:ActiveQuery“与”不工作
【发布时间】:2014-11-04 09:23:53
【问题描述】:

情况

我有三个与 1:n 相关的模型/数据库表:一个order 有多个commissions,一个委员会有多个commission_positions。因此,commission_position 有一个包含佣金 id 的 FK 字段。佣金本身有一个包含订单 ID 的 FK 字段。

订单 > 佣金 > 佣金头寸

问题

我现在需要做的是在相关的 Order-Model 中选择所有具有特定值的 CommissionPositions。明显的解决方案是使用我用命名范围扩展的 CommissionPosition 的查询对象。命名范围如下所示:

class CommissionPositionQuery extends ActiveQuery
{
   /**
     * Named scope to filter positions of a certain alpha order id
     * @param integer $id the alpha order id
     * @return \common\models\query\CommissionPositionQuery
     */
    public function alphaOrderId($id)
    {
        //TODO: with not working
        $this->with(['commission.order']);
        $this->andWhere(['alpha_order_id'=>$id]);
        return $this;
    }
}

commission 的关系是在 Commission-Model 上定义的并且正在工作。第二个关系order 是在佣金模型上定义的,并且也可以正常工作。过滤字段alpha_order_id 在订单表中。现在我执行这样的查询:

$filteredPositions = CommissionPosition::find()->alphaOrderId(17)->all();

作用域被成功调用并使用了 where-part,但是当我检查生成的 SQL 时,即使我使用 with- 方法告诉 yii 一起获取关系,我也看不到连接语句。响应是“未知列 alpha_order_id”,这是有道理的,因为相关表没有连接。这是生成的 SQL:

SELECT * FROM `commission_position` WHERE (`alpha_order_id`=17)

我错过了什么?这是 Yii2 的 bug 吗?

【问题讨论】:

    标签: yii2


    【解决方案1】:

    自己找到了解决方案。 Yii1 和 Yii2 之间的命名变化导致了一些混乱。为了防止其他人在这里浪费时间,详细信息:

    Yii1

    在 yii 1 中,您可以像这样直接加入一个关系(示例:佣金):

    $query->with = 'commission'
    $query->together = true;
    

    Yii2 / 区别

    当调用with-方法(如问题中所示)时,关系已成功添加到ActiveQuery 的with-array 中。但是,在执行查询时,连接部分丢失了。

    解决方案

    似乎 with 方法不是要走的路。相反,我使用了名为 joinWith 的方法,其签名如下:

    public function joinWith($with, $eagerLoading = true, $joinType = 'LEFT JOIN')
    

    现在,如答案中所述,我将关系定义为第一个参数 ('commission.order'),其余部分保持不变,因为默认值非常好。注意第二个参数的默认值。这样可以确保直接加入关系!

    Voilà...生成的 sql 包含所需的连接。但是要考虑一个陷阱:模棱两可的列命名当然要由我们自己处理!方法文档链接:

    http://www.yiiframework.com/doc-2.0/yii-db-activequery.html#joinWith()-detail

    【讨论】:

    • 另外值得注意的是,它不会自动为连接创建别名。例如CoreStudent::find()->joinWith(['user'])->where(['user.surname' =>$surname ])-one() 如果关系名和表不一样还是会报错名称
    【解决方案2】:

    如果您想要JOIN,请使用:

    $this->joinWith(['commission.order']);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多