2016-07-13 76 views
2

我有2个表(滑块,图像)有关联(sliders_images)表,关系工作正常,但我nedd以特定的顺序获取相关数据,定义的属性正确的顺序是在结合表,该关系被定义为:Yii2订单项的多对多关系

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

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

+0

Korshunow感谢您的重播,您的建议是不正确的方式,但打开我的想法找到解决方案。表格图像没有display_order属性,这是一个联结表属性。为了在查询中具有联结表属性,我需要一个'joinWith()'语句。遵循正确的答案。 – MarBer

+1

哦,错过了)你说得对。实际上,我总是更喜欢为每个表声明分离的AR实体,并在关系和查询中处理'via'和'joinWith'而不是直接表引用。这种方法导致更加干净,灵活和可持续的代码恕我直言。所以,当然,你以正确的方式)) – oakymax

1

正确的方法是增加与结表->joinWith('slidersImages')联接为获得结表属性,然后通过其中一个进行排序。完整的代码:

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