Ich habe zwei Tabellen wie folgt:
Produkte:
%Vor%Preise:
%Vor%Ich habe diese Beziehung auf Produkt:
%Vor% Ich kann einfach Product::with('prices')->get();
ausführen, um jedes Produkt mit jedem der Preise zu erhalten, die es hatte.
Wie kann ich mit Eloquent nur den aktuellsten Preis erhalten? (Und wenn ich stattdessen den billigsten / teuersten Preis haben wollte?)
Sie können Ihre Beziehungen optimieren, um zu bekommen, was Sie wollen. Akzeptierte Antwort natürlich funktioniert, aber es könnte Speicher Overkill mit vielen Daten sein.
Hier erfahren Sie mehr und dort .
So verwenden Sie Eloquent:
%Vor%Das ist nett, aber es gibt noch mehr. Stellen Sie sich vor, Sie möchten den höchsten Preis (nur einen Wert) für alle Produkte laden:
%Vor%Noch nicht sehr praktisch:
%Vor%Fügen Sie diesen Accessor hinzu, um das Leben zu erleichtern:
%Vor%Wenn Laravel eager eine Beziehung lädt, führt es zwei ähnliche Abfragen aus:
%Vor%Sie möchten der zweiten Abfrage eine Bedingung hinzufügen, um die Zeile mit dem neuesten Preis zu erhalten. Du möchtest also so etwas:
%Vor% Glücklicherweise können Sie in Laravels Eager Load Constraints anstatt eine Zeichenfolge in with()
zu übergeben Übergeben Sie ein Array mit dem Beziehungsnamen als Schlüssel und einem Unterabfrageabschluss als Wert. So:
Dann in Ihrem Code können Sie tun:
%Vor%um den neuesten Preis für jedes Produkt zu erhalten.
Hinweis: Möglicherweise stellen Sie fest, dass Laravel weiterhin alle Preise für jedes Produkt lädt. Ich denke nicht, dass es einen Weg gibt, während man immer noch rein eloquent arbeitet, weil die Art und Weise, wie eifrige Ladearbeit alle Beziehungsdatensätze in einer einzigen Abfrage abruft, es keinen einfachen Weg gibt, nur den jeweils neuesten Preis zu erhalten Produkt.
Eine andere Lösung:
Wenn Sie jedoch unbedingt nur einen Wert aus einer anderen Tabelle kennen müssen, können Sie stattdessen eine Unterauswahl treffen:
%Vor%