2015-10-22 8 views
6

Ich habe mehrere Tabellen, die zusammenkommen und ich brauche eine Abfrage und bekommen alle Referenzen auch!
ist das möglich in yii2 ??
Holen Sie sie in Hierarchie-Array?
Wie ???Wie bekomme Tabelle mit Referenzen andere Tabelle in yii2?

Ist es möglich, nicht Join ???

danke für deine hilfe !!!!

sample db

+0

Warum möchten Sie ** nicht ** Joins verwenden? – Sjon

+0

seine möglichkeit ohne beitreten? Lazyloading oder sowas !! – mohsen

+0

Ich denke, Beitritt ist auch besser. Können Sie uns mehr darüber erzählen, wie Sie Ihre Ausgabe wünschen? –

Antwort

1

Wenn Sie die Modellklassen für jede Tabelle mit Gii erstellt und ausgewählt haben, um die Relationen in den generierten Modellen zu erstellen, können Sie Folgendes tun.

1) In Ihrer Länder-Modell nur die Methode ändern, die die Beziehung zu Flughäfen wie folgt erklärt:

public function getAirports() { 
    return $this->hasMany(Airports::className(), ['country_id' => 'id'])->with('airlines'); 
} 

2) Wenn Sie die Abfrage für die Länder tun, und Sie müssen die entsprechenden Flughäfen haben, Fluggesellschaften und flightbooked es wie folgt zu tun:

$countries = Countries::find() 
    ->where('something = something_else') 
    ->with('airports') 
    ->with('flightbooked') 
    ->all(); 

auf diese Weise können alle verwandten Modelle bevölkert mit viel weniger Anfragen an die Datenbank als die Verwendung von Lazy-Laden zu bekommen.

0

Vielleicht kann u Vereinigung alle für diese. Mit diesem Operator können Sie die Ergebnismengen mehrerer Abfragen zusammenführen und dabei alle Zeilen beibehalten. Beachten Sie, dass ein UNION-Operator (ohne das Schlüsselwort ALL) alle doppelten Zeilen löscht, die in der Ergebnismenge vorhanden sind. Der UNION ALL-Operator behält alle Zeilen aus jeder Abfrage bei (und wird wahrscheinlich eine bessere Leistung erzielen, da der Aufwand für die Durchführung der doppelten Prüfungs- und Entfernungsoperation nicht gegeben ist).

Die Anzahl der Spalten und der Datentyp jeder Spalte müssen in jeder der Abfragen übereinstimmen. Wenn eine der Abfragen mehr Spalten als die andere enthält, fügen wir manchmal Dummy-Ausdrücke in die andere Abfrage ein, damit die Spalten und Datentypen übereinstimmen. Häufig ist es hilfreich, in die SELECT-Liste jeder Abfrage, die ein Literal zurückgibt, einen Ausdruck (eine zusätzliche Spalte) einzufügen, um anzuzeigen, welche der Abfragen die "Quelle" der Zeile war.

SELECT 'col1' AS source, col23, col343, col33, d FROM table1 WHERE ... 
UNION ALL 
SELECT 'col2', t2.fee, table2.fi, table2.fo, 'fum' FROM table2 JOIN table3 ON ... 
UNION ALL 
SELECT 'col3', '1', '2', buckle, my_shoe FROM table4 

Sie eine Abfrage wie dies in einer Reihe von Klammern wickeln kann, und es als Inline-Ansicht (oder „abgeleitete Tabelle“, in MySQL-Jargon), so dass Sie Aggregat Operationen auf alle der ausführen können Reihen. Beispiel:

select one.a 
    , SUM(one.b) 

    FROM (
     SELECT 'q1' AS source, a, b, c, d FROM t1 
      UNION ALL 
     SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 
     ) one 
GROUP BY one.a 
ORDER BY one.a 

Aber ich denke, Tabellen beitreten besser geeignet. Hoffe, dass Sie helfen,

+0

ja ich denke Beitritt ist besser! – mohsen

1

Ich wollte nur eine kleine Anregung geben:

Wie Sie die Beziehungen in den Tabellen pflegen, und wenn Sie Ihren Code mit Gii erzeugt haben, dann werden diese erzeugen die für Sie verbinden. Sie können dann leicht auf jede Spalte einer Tabelle zugreifen.

Aber ich denke, UNION kann keine Alternative zu JOIN sein.

Verwandte Themen