首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveRecord在via表上的位置和顺序

ActiveRecord在via表上的位置和顺序
EN

Stack Overflow用户
提问于 2014-12-29 14:07:17
回答 7查看 32.7K关注 0票数 19

我有三个数据库表:

产品(id,名称)

product_has_adv (产品,优势,分类,重要)

优势(id,文本)

在ProductModel中,我定义了以下内容:

代码语言:javascript
复制
public function getAdvantages()
    {
        return $this->hasMany(AdvantageModel::className(), ['id' => 'advantage'])
            ->viaTable('product_has_advantage', ['product' => 'id']);
    }

我得到了好处,没有任何问题。

但是现在我需要添加一个where product_has_advantage.important =1 clausel,并根据ProductHis有利表中的排序列对这些优势进行排序。

我必须如何和在哪里意识到这一点?

EN

回答 7

Stack Overflow用户

发布于 2017-03-30 18:50:29

使用带有关系的viaTable方法将导致两个单独的查询,但如果不需要link()方法,则可以使用innerJoin按product_has_advantage表进行排序:

代码语言:javascript
复制
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关系。

票数 6
EN

Stack Overflow用户

发布于 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()子句忽略顺序。

票数 4
EN

Stack Overflow用户

发布于 2017-07-07 10:21:14

对于经过一段时间后来到这里并且不喜欢上述解决方案的人,我通过在筛选器via表之后加入via表来实现它的工作。

上面代码的示例:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27690401

复制
相关文章

相似问题

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