我有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排序的,我怎样才能获得按其他属性排序的图像?
答案 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]);
}