【问题标题】:Yii2 order items of many-to-many relationYii2 多对多关系的订单项
【发布时间】:2016-07-13 15:31:49
【问题描述】:

我有 2 个与联结 (sliders_images) 表相关的表(滑块、图像),关系工作正常,但我需要以特定顺序获取相关数据,定义正确顺序的属性在联结表中,关系定义为:

public function getImages(){
    return $this->hasMany(Images::className(), ['id' => 'image_id'])
        ->viaTable('sliders_images', ['slider_id' => 'id'], function($query){
            $query->orderBy('sliders_images.display_order ASC');
        });
}

当我打电话给$model->images 时,我收到正确的图像但顺序错误,使用 foreach 图像是按 id 排序的,我如何获得按其他属性排序的图像?

【问题讨论】:

    标签: php activerecord yii2 yii2-advanced-app


    【解决方案1】:

    正确的方法是添加与联结表->joinWith('slidersImages') 的连接以获取联结表属性,然后按其中一个进行排序。完整代码:

    public function getImages(){
            return $this->hasMany(Images::className(), ['id' => 'image_id'])
            ->via('slidersImages')
            ->joinWith('slidersImages SI')
            ->orderBy('SI.display_order ASC');
    }
    

    【讨论】:

      【解决方案2】:

      在这种情况下,orderBy 将应用于第一个查询 (SELECT * FROM sliders_images ...),因此如果您要检查生成的 sql:

      echo $model->getImages()->createCommad()->rawSql;
      

      然后你会看到这样的东西

      SELECT * FROM images WHERE id IN (4, 2, 3, 1) 
      

      这将是正确的顺序。但是在结果集中,您按 id (1, 2, 3, 4) 排序。

      所以要获得正确的顺序,您应该将所需的orderBy 添加到您的hasMany

      public function getImages(){
        return $this->hasMany(Images::className(), ['id' => 'image_id'])
          ->viaTable('sliders_images', ['slider_id' => 'id'])
          ->orderBy(['images.display_order' => SORT_ASC]);
      }
      

      相关话题:ActiveRecord where and order on via-table

      【讨论】:

      • Korshunow 感谢重播,您的建议不是正确的方法,但请敞开心扉寻找解决方案。表图像没有 display_order 属性,这是一个联结表属性。为了在查询中有联结表属性,我需要一个joinWith() 语句。遵循正确的答案。
      • 哦,错过了)你说得对。实际上,我总是更喜欢为每个表声明单独的 AR 实体并处理 viajoinWith 而不是关系和查询中的直接表引用。这种方法导致更干净、灵活和可持续的代码恕我直言。所以,当然,你是在正确的方式))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多