首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii2:使用"with“时联接条件参数为空

问Yii2:使用"with“时联接条件参数为空
EN

Stack Overflow用户
提问于 2016-03-09 17:02:17
回答 1查看 772关注 0票数 1

我有多到多的关系:

代码语言:javascript
复制
Parent(id) <- Link(parent,child,sort) -> Product(sku)

我想从父模型中获得产品的排序列表。

在父模型上,我有两个函数:

代码语言:javascript
复制
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]);
}

如果我直接给这个关系打电话,它就能正常工作。

代码语言:javascript
复制
$model = Parent::findOne(1234);
$products = $model->products;

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

如果该关系作为"with“失败的一部分调用,则$this->id将为null,这意味着不返回任何产品。

代码语言:javascript
复制
Parent::find()->with('products')->all();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-15 11:34:29

经过多次绞尽脑汁之后,我已经决定了唯一的解决办法,就是放弃许多需要排序的产品列表的多个关系,然后这样做:

代码语言:javascript
复制
$model = Parent::find()->where(['id' => 1234])->with('linksDown.products')->one();

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

代码语言:javascript
复制
foreach( $model->linksDown as $link ) {
    dosomethingwith($link->product);
}

为了使这一工作正常进行,需要将排序应用于linksDown关系:

代码语言:javascript
复制
public function getLinksDown()
{
    return $this->hasMany( DBLink::className(), ['parent' => 'id'])
        ->from(['linksDown' => DBLink::tableName()])
        ->orderBy([linksDown.order => SORT_ASC]);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35897938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档