Yii2:ActiveQuery";加上;不起作用 情况

Yii2:ActiveQuery";加上;不起作用 情况,yii2,Yii2,我有三个与1:n相关的模型/db表:一个订单有多个佣金,一个佣金有多个佣金位置。因此,佣金位置有一个包含佣金id的FK字段。佣金本身有一个包含订单id的FK字段 订单>佣金>佣金位置 问题 我现在需要做的是选择相关订单模型中具有特定值的所有佣金头寸。显而易见的解决方案是使用CommissionPosition的查询对象,我用命名范围扩展了该对象。命名范围如下所示: class CommissionPositionQuery extends ActiveQuery { /** *

我有三个与1:n相关的模型/db表:一个
订单
有多个
佣金
,一个佣金有多个
佣金位置
。因此,佣金位置有一个包含佣金id的FK字段。佣金本身有一个包含订单id的FK字段

订单>佣金>佣金位置

问题 我现在需要做的是选择相关订单模型中具有特定值的所有佣金头寸。显而易见的解决方案是使用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;
    }
}
$filteredPositions = CommissionPosition::find()->alphaOrderId(17)->all();
$query->with = 'commission'
$query->together = true;
佣金关系在佣金模型和工作模式中定义。第二个关系
订单
在佣金模型上定义,也起作用。过滤字段
alpha\u order\u id
位于订单表中。现在我执行如下查询:

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;
    }
}
$filteredPositions = CommissionPosition::find()->alphaOrderId(17)->all();
$query->with = 'commission'
$query->together = true;
成功调用了作用域并使用了where部分,但是当我检查生成的SQL时,我没有看到join语句,即使我使用
with
-方法告诉yii一起获取关系。响应为“未知列alpha_order_id”,这是有意义的,因为没有相关表的联接。这是生成的SQL:

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

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

我自己找到了答案。Yii1和Yii2之间的命名更改导致了一些混乱。为避免其他人在此处浪费时间,请参阅以下详细信息:

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

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;
    }
}
$filteredPositions = CommissionPosition::find()->alphaOrderId(17)->all();
$query->with = 'commission'
$query->together = true;
Yii2/差异 调用问题中所示的
with
-方法时,关系已成功添加到
ActiveQuery
的with数组中。但是,在执行查询时,缺少联接部分

解决方案 看来用这种方法是不行的。相反,我使用了名为
joinWith
的方法,并带有以下签名:

public function joinWith($with, $eagerLoading = true, $joinType = 'LEFT JOIN')
现在,如回答中所述,我将关系定义为第一个参数(
'commission.order'
),其余参数保持不变,因为默认值非常好。请注意第二个参数的默认值。这样可以确保直接加入关系

瞧……结果sql包含所需的连接。不过有一个陷阱需要考虑:模棱两可的专栏命名当然要由我们自己来处理!链接到该方法的文档:


如果您想加入
团队
请使用:

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

还值得注意的是,它不会自动为联接创建别名。e、 g.CoreStudion::find()->joinWith(['user'])->where(['user.name'=>$nam姓氏])-one()在关系名与表名不相同时仍将出错