Php Yii2多对多关系的订单项
我有两个与junction(sliders\u images)表相关的表(sliders,images),该关系工作正常,但我需要获得具有特定顺序的相关数据,定义正确顺序的属性位于junction表中,该关系定义为:Php Yii2多对多关系的订单项,php,activerecord,yii2,yii2-advanced-app,Php,Activerecord,Yii2,Yii2 Advanced App,我有两个与junction(sliders\u images)表相关的表(sliders,images),该关系工作正常,但我需要获得具有特定顺序的相关数据,定义正确顺序的属性位于junction表中,该关系定义为: public function getImages(){ return $this->hasMany(Images::className(), ['id' => 'image_id']) ->viaTable('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排序图像,如何获得按其他属性排序的图像?在这种情况下,orderBy
将应用于第一个查询(从滑块中选择*图像…
),因此,如果要检查生成的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]);
}
相关主题:正确的方法是添加一个join with junction table
->joinWith('sliderimage')
以获取连接表属性,然后按其中一个属性排序。完整代码:
public function getImages(){
return $this->hasMany(Images::className(), ['id' => 'image_id'])
->via('slidersImages')
->joinWith('slidersImages SI')
->orderBy('SI.display_order ASC');
}
Korshunow感谢您的重播,您的建议不是正确的方式,但请打开我的心扉,找到解决方案。表格图像没有显示顺序属性,这是一个连接表格属性。为了在查询中具有连接表属性,我需要一个
joinWith()
语句。遵循正确的答案。哦,错过了那个)你说得对。实际上,我总是喜欢为每个表声明独立的AR实体,并通过和joinWith
处理,而不是在关系和查询中直接引用表。这种方法导致IMHO的代码更加干净、灵活和可持续。所以,毫无疑问,你走对了道路