Hat viele durch viele-zu-viele

8

Ich habe das folgende Tabellenlayout:

%Vor%

products und metrics haben eine Viele-zu-viele-Beziehung mit einer Pivot-Spalte mit Wert.

deals und products haben auch eine Viele-zu-Viele-Beziehung.

Ich kann Messwerte für ein Produkt mit $product->metrics abrufen, aber ich möchte alle Messwerte für alle Produkte abrufen können, die mit einem Geschäft in Zusammenhang stehen. So könnte ich beispielsweise Folgendes tun: $deal->metrics .

Ich habe derzeit Folgendes in meinem Deal -Modell:

%Vor%

Aber das gibt keine Beziehung zurück, also kann ich es nicht eifrig laden oder verwandte Modelle daraus machen.

Es muss im Beziehungsformat sein, weil sie für meinen Anwendungsfall eifrig geladen werden müssen.

Danke für Ihre Hilfe!

    
ntzm 25.05.2016, 07:14
quelle

4 Antworten

5

Wenn Sie eine benutzerdefinierte Beziehung haben möchten, können Sie Ihre eigene Erweiterung für die abstrakte Beziehungsklasse erstellen. Zum Beispiel: BelongsToManyThought .

Aber wenn Sie keine Beziehung implementieren möchten, denke ich, dass sie Ihre Bedürfnisse erfüllen kann:

In App \ Deal.php können Sie die Lösung von @ thomas-van-der-veen

kombinieren %Vor%

Sie können sich auf diesen Beitrag beziehen, um zu sehen, wie Sie kann einfach verschachtelte Relationen verwenden.

Mit dieser Lösung können Sie die Beziehung mit der Methode und dem Zugriff auf das Attribut metrics abfragen.

    
mpur 09.06.2016, 08:17
quelle
3

Dies sollte den Trick machen:

Die Datei "Models / Product.php":

%Vor%

die Models / Deal.php-Datei:

%Vor%

die Models / Metric.php Datei:

%Vor%

Von Ihrem Controller:

%Vor%

Jetzt haben Sie eine Sammlung von Deals mit Produkten und deren zugehörigen Messwerten. Weitere Informationen finden Sie in den Dokumenten zum verschachtelten Eager-Laden.

    
Rafael Berro 06.06.2016 16:13
quelle
1

Ich habe nicht genug Rep für einen Kommentar, damit ich stattdessen eine Antwort posten kann.

Vor ein paar Tagen habe ich eine ähnliche Frage gestellt und konnte es selbst beantworten. Ich denke, die Lösung funktioniert auch für diese Frage.

Indem Sie die Tabellen manuell verbinden und eine Where-Klausel hinzufügen, können Sie die gewünschten Metriken abrufen.

Mögliche Lösung:

%Vor%

Hoffe das hilft:)

Nach @ ntzm-Kommentar bearbeiten

Wenn Sie nur einige Eigenschaften der Metrik-Tabelle und keine der Modell-Funktionen benötigen, können Sie vor den Joins ein select ('*') hinzufügen.

So:

%Vor%

Es wird ein metrisches Modell mit allen Attributen der verbundenen Tabellen zurückgegeben.

In diesem Beispiel wird ein Objekt wie folgt zurückgegeben:

%Vor%

Da es viele Spalten mit demselben Namen gibt, können Sie nicht auf diese Werte zugreifen. Sie können die Spalten jedoch mehrfach auswählen und umbenennen.

So:

%Vor%

Dies führt zu etwas wie:

%Vor%

Ich hoffe, das wird etwas lösen :) Natürlich gibt es viel sauberere Wege, um Ihr Problem zu lösen.

    
Thomas Van der Veen 25.05.2016 08:08
quelle
1

Es ist keine "Viele zu viele durch" -Methode verfügbar.

Um alle Metriken in allen Produkten für einen bestimmten Deal verfügbar zu machen, erstellen Sie einen Getter zu Eager Laden Sie alle Produkte und Metriken für den Deal und nutzen Sie Laravels Collections-Methoden.

In Ihrem Deal -Modell:

%Vor%

Sie können dann die Messwerte für einen Deal mit $deal->getMetrics()

abrufen

Dies wird eine Sammlung von Metriken-Objekten zurückgeben, die genau das sein sollten, wonach Sie suchen.

    
crabbly 09.06.2016 06:30
quelle

Tags und Links