我有三个数据库表:
产品(id,名称)
product_has_adv (产品,优势,分类,重要)
优势(id,文本)
在ProductModel中,我定义了以下内容:
public function getAdvantages()
{
return $this->hasMany(AdvantageModel::className(), ['id' => 'advantage'])
->viaTable('product_has_advantage', ['product' => 'id']);
}我得到了好处,没有任何问题。
但是现在我需要添加一个where product_has_advantage.important =1 clausel,并根据ProductHis有利表中的排序列对这些优势进行排序。
我必须如何和在哪里意识到这一点?
发布于 2017-03-30 18:50:29
使用带有关系的viaTable方法将导致两个单独的查询,但如果不需要link()方法,则可以使用innerJoin按product_has_advantage表进行排序:
public function getAdvantages()
{
$query = AdvantageModel::find();
$query->multiple = true;
$query->innerJoin('product_has_advantage','product_has_advantage.advantage = advantage.id');
$query->andWhere(['product_has_advantage.product' => $this->id, 'product_has_advantage.important' => 1]);
$query->orderBy(['product_has_advantage.sort' => SORT_DESC]);
return $query;
}备注$query->multiple = true允许您将此方法用作Yii2 hasMany关系。
发布于 2016-06-02 08:46:33
仅供参考,https://github.com/yiisoft/yii2/issues/10174几乎不可能使用ORDER BY viaTable()列。对于YI2.0.7,它从viaTable()查询返回一组ID,而final/top query IN()子句忽略顺序。
发布于 2017-07-07 10:21:14
对于经过一段时间后来到这里并且不喜欢上述解决方案的人,我通过在筛选器via表之后加入via表来实现它的工作。
上面代码的示例:
public function getAdvantages()
{
return $this->hasMany(AdvantageModel::className(), ['id' => 'advantage'])
->viaTable('product_has_advantage', ['product' => 'id'])
->innerJoin('product_has_advantage','XXX')
->orderBy('product_has_advantage.YYY'=> SORT_ASC);
}注意使用正确的连接路径更改XXX,用正确的排序列更改YYY。
https://stackoverflow.com/questions/27690401
复制相似问题