Yii2:使用“with”时,Join条件参数为null

时间:2016-03-09 17:02:17

标签: activerecord yii2

我有很多关系:

Parent(id) <- Link(parent,child,sort) -> Product(sku)

我想从父模型中获取排序产品列表

在父模型上我有几个功能:

public function getLinksDown()
{
    return $this->hasMany( DBLink::className(), ['parent' => 'id'])
        ->from(['linksDown' => DBLink::tableName()]);
}

public function getProducts()
{
    return $this->hasMany(DBProduct::className(), ['sku' => 'child'])
        ->from(['products' => DBProduct::tableName()])
        ->via('linksDown')
        ->innerJoin(
            ['linx' => DBLink::tableName()],
            'linx.child = products.sku AND linx.parent=:parent',
            [':parent' => $this->id]
        )
        ->orderBy(['linx.order' => SORT_ASC]);
}

如果我直接调用该关系,它可以正常工作。

$model = Parent::findOne(1234);
$products = $model->products;

产品是正确排序的产品列表。

如果关系被称为“with”的一部分,则失败,$ this-&gt; id将为null,这意味着不会返回任何产品。

Parent::find()->with('products')->all();

1 个答案:

答案 0 :(得分:0)

经过多次努力之后,我决定唯一的解决方案就是放弃多对多的关系,我需要一个有序的产品清单,并做这样的事情:

$model = Parent::find()->where(['id' => 1234])->with('linksDown.products')->one();

并通过linksDown关系引用每个产品,而不是直接从父模型引用。

foreach( $model->linksDown as $link ) {
    dosomethingwith($link->product);
}

为了完成这项工作,需要将sort应用于linksDown关系:

public function getLinksDown()
{
    return $this->hasMany( DBLink::className(), ['parent' => 'id'])
        ->from(['linksDown' => DBLink::tableName()])
        ->orderBy([linksDown.order => SORT_ASC]);
}