Heim  >  Artikel  >  Backend-Entwicklung  >  Problem mit Laravel-Mehrtabellen-Assoziationsabfragen

Problem mit Laravel-Mehrtabellen-Assoziationsabfragen

WBOY
WBOYOriginal
2016-08-27 09:06:521639Durchsuche

Drei MySQL-Datentabellen

  • Produktliste (Produkt)

  • Paket

  • Paketinformationstabelle (package_data).

Hauptfelder der Produkttabelle:

  • id (selbst-inkrementierende ID)

  • Name

  • ...

Hauptfelder der Pakettabelle:

  • id (selbst-inkrementierende ID)

  • Titel(Paketname)

  • ....

Hauptfelder der Paketinformationstabelle:

  • id (selbst-inkrementierende ID)

  • product_id (Produkt-ID)

  • Paket-ID (Paket-ID)

  • product_num (Anzahl der Produkte)

  • ...

Einfache Anleitung:

Ein Paket enthält mehrere Produkte. Die Pakettabelle und die Paketinformationstabelle hätten jedoch in einer Tabelle platziert werden können. Um redundante Daten zu reduzieren, wurde die Pakettabelle jedoch einfach vertikal unterteilt.

Hier kommt das Problem :-)

  • Im obigen Fall möchte ich wissen, wie viele Produkte A in Paket A enthalten sind. Wie definiert man also die Beziehungen im Modell?

  • In der oben genannten Situation möchte ich wissen, wie viele Produkte A, Produkt B usw. insgesamt für Paket A und Paket B verwendet werden. Wie soll ich also vorgehen?

ps: Die oben genannten Fragen wurden in den offiziellen Dokumenten gelesen, aber mein IQ ist zu niedrig, was zu unklarem Verständnis führt, daher bin ich hier, um Sie um Rat zu bitten.

Ich freue mich auf Ihre enthusiastische Anleitung ^_^

Antwortinhalt:

Drei MySQL-Datentabellen

  • Produktliste (Produkt)

  • Paket

  • Paketinformationstabelle (package_data).

Hauptfelder der Produkttabelle:

  • id (selbst-inkrementierende ID)

  • Name

  • ...

Hauptfelder der Pakettabelle:

  • id (selbst-inkrementierende ID)

  • Titel(Paketname)

  • ....

Hauptfelder der Paketinformationstabelle:

  • id (selbst-inkrementierende ID)

  • product_id (Produkt-ID)

  • Paket-ID (Paket-ID)

  • product_num (Anzahl der Produkte)

  • ...

Einfache Anleitung:

Ein Paket enthält mehrere Produkte. Die Pakettabelle und die Paketinformationstabelle hätten jedoch in einer Tabelle platziert werden können. Um redundante Daten zu reduzieren, wurde die Pakettabelle jedoch einfach vertikal unterteilt.

Hier kommt das Problem :-)

  • Im obigen Fall möchte ich wissen, wie viele Produkte A in Paket A enthalten sind. Wie definiert man also die Beziehungen im Modell?

  • In der oben genannten Situation möchte ich wissen, wie viele Produkte A, Produkt B usw. insgesamt für Paket A und Paket B verwendet werden. Wie soll ich also vorgehen?

ps: Die oben genannten Fragen wurden in den offiziellen Dokumenten gelesen, aber mein IQ ist zu niedrig, was zu unklarem Verständnis führt, daher bin ich hier, um Sie um Rat zu bitten.

Ich freue mich auf Ihre enthusiastische Anleitung ^_^

Ähem~, endlich habe ich die Antwort im Dokument gefunden. Link hier. Bitte suchen Sie nach dem Abschnitt „Nested Eager Loading“, um ihn selbst anzuzeigen.

Sagen Sie mir den konkreten Prozess:

Die Methode hasManyData() ist im Paketmodell definiert

<code class="php">public function hasManyData()
{
    return $this->hasMany(PackageData::class, 'package_id', 'id');
}</code>

Die BelongsToProduct()-Methode ist im package_data-Modell definiert

<code class="php">public function BelongsToProduct()
{
    return $this->belongsTo(Product::class, 'product_id', 'id');
}</code>

Wird im Controller verwendet:

<code class="php">$packageList = Package::with('hasManyData', 'package_data.BelongsToProduct')->get();</code>

Du bist fertig!

Noch ein Plan

ps: Die von einem Kollegen angegebene Methode ist ungefähr so: Das Folgende ist der Pseudocode:

<code class="php">$packageList = Package::with('hasManyData')->get();

foreach( $packageList as $key => $val )
{
    ...
    $productList = PackageData::with('BelongsToProduct')->where(...)->get();
    ...
}</code>

Ich finde die Leistung schrecklich~ und ich möchte sie nicht mehr studieren! Mein Kopf ist etwas heiß, daher ist das, was ich geschrieben habe, etwas chaotisch. Bitte korrigieren Sie mich, wenn ich falsch liege. Vielen Dank an alle, die sich diese Ausgabe angesehen haben~

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn