2016-07-13 78 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'); 
}