2016-07-13 16 views
2

Ich habe 2 Tabellen (Schieberegler, Bilder) im Zusammenhang mit Junction (sliders_images) Tabelle, die Beziehung funktioniert gut, aber ich Nedd, um verwandte Daten mit bestimmten Reihenfolge, das Attribut zu definieren die richtige Reihenfolge in der Verknüpfungstabelle ist, wird die Beziehung wie folgt definiert:Yii2 Reihenfolge Elemente der Viele-zu-viele-Beziehung

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'); 
     }); 
} 

, wenn ich rufe $model->images ich die richtigen Bilder, aber die falsche Reihenfolge, mit foreach den Bildern empfangen wurde von id bestellt, wie kann ich das bekommen Bilder sortiert nach anderen Attributen?

Antwort

0

In diesem Fall orderBy wird auf die erste Abfrage (SELECT * FROM sliders_images ...) angewendet werden, wenn Sie also generierten SQL prüfen werde:

echo $model->getImages()->createCommad()->rawSql; 

dann werden Sie so etwas wie dieses

SELECT * FROM images WHERE id IN (4, 2, 3, 1) 

sehen und Hier wird die richtige Reihenfolge sein. Aber in der resultierenden Menge hast du die Reihenfolge nach der ID erhalten (1, 2, 3, 4).

So richtig zu machen, um Sie gewünschte orderBy zu Ihrem hasMany hinzufügen sollen:

public function getImages(){ 
    return $this->hasMany(Images::className(), ['id' => 'image_id']) 
    ->viaTable('sliders_images', ['slider_id' => 'id']) 
    ->orderBy(['images.display_order' => SORT_ASC]); 
} 

Verwandtes Thema: ActiveRecord where and order on via-table

+0

Korshunow danke für die Wiederholung, ist Ihr Vorschlag nicht der richtige Weg, aber öffnen Sie meine Meinung, um die Lösung zu finden. Die Tabellenabbilder haben kein display_order-Attribut, dies ist ein Junction-Tabellenattribut. Für das Junction-Tabellen-Attribut in der Abfrage brauche ich eine 'joinWith()' Anweisung. Folgt der richtigen Antwort. – MarBer

+1

Oh, verpasste das) Du hast Recht. Eigentlich bevorzuge ich es immer, separate AR-Entitäten für jede Tabelle zu deklarieren und mit "via" und "joinWith" statt direkter Tabellenreferenzen in Relationen und Abfragen umzugehen. Dieser Ansatz führt zu mehr sauberem, flexiblem und nachhaltigem Code IMHO. Also, definitiv, Sie auf dem richtigen Weg)) – oakymax

1

Der richtige Weg ist ein ->joinWith('slidersImages') mit Verknüpfungstabelle verbinden hinzuzufügen, um die Verknüpfungstabelle zu erhalten Attribute und dann von einem von denen bestellen. Der vollständige Code:

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