Yii2:ActiveQuery" with"不工作

时间:2014-11-04 09:23:54

标签: yii2

情境

我有三个与1:n相关的模型/ db-tables:order有多个commissions,佣金有多个commission_positions。因此,commission_position具有包含佣金ID的FK字段。佣金本身有一个包含订单ID的FK字段。

订单>佣金> CommissionPositions

问题

我现在需要做的是选择相关订单模型中具有特定值的所有CommissionPositions。显而易见的解决方案是使用CommissionPosition的Query-Object,我使用命名范围进行扩展。命名范围如下所示:

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是在委员会模型上定义并且有效的。第二个关系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的错误吗?

1 个答案:

答案 0 :(得分:9)

自己找到了自己的灵魂。 Yii1和Yii2之间的命名变化导致一些混乱。为了防止他人在这里浪费时间的细节:

Yii1

在yii 1中,您将直接加入一个关系(示例:佣金):

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

Yii2 /差异

调用问题中显示的with - 方法时,关系已成功添加到ActiveQuery的with-array中。但是,在执行查询时,缺少连接部分。

解决方案

似乎with-method不是要走的路。相反,我使用名为joinWith的方法,并使用以下签名:

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

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

Voilà...生成的sql包含所需的连接。但是要考虑一个陷阱:Ambigious column namings当然要由我们自己处理!链接到该方法的文档:

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