我有很多关系:
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();
答案 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]);
}