Yii2订单项的多对多关系

时间:2016-07-13 15:31:50

标签: php activerecord yii2 yii2-advanced-app

我有2个表(滑块,图片)与junction(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排序的,我怎样才能获得按其他属性排序的图像?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

在这种情况下,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