2016-10-04 5 views
0

Ich versuche, eine DB-Abfrage mit Laravel zu schreiben 5.3 des Has Many Through optionLaravel - hat viele Durch

sind meine DB-Tabellen gelegt wie folgt:

http://sqlfiddle.com/#!9/a9c9af

Die Tische sind:

Unternehmen company_offers bietet

In meinem Modell I h ave die folgende Einstellung:

public function offers() 
    { 
     return $this->hasManyThrough(
      'App\Offers', 'App\CompanyOffers', 
      'company_offer_id', 'offer_id' 
     ); 
    } 

Wenn ich versuche, die folgende Codezeile auszuführen:

return $this->whereHas('offers', function($query) use ($offer_id) 
     { 
      return $query->whereIn('offer_id', $offer_id); 
     }); 

ich den Fehler:

Integrität Einschränkungsverletzung: 1052 Spalte 'OFFER_ID' in where Klausel ist mehrdeutig

Wie funktioniert Ich korrigiere das und finde die Beziehung richtig?

Ich brauche die Angebot Titel & Angebot Symbol für meine Frontend-Ansicht.

Hoffe das macht Sinn und jemand kann mir helfen.

Dank

Antwort

0

„Spalte‚OFFER_ID‘in where-Klausel ist nicht eindeutig“ bedeutet im Grunde, die SQL-Abfrage mit mehreren Tabellen zu tun und es nicht weiß, welche Tabelle offer_id sie bezieht:

Zum Beispiel des Abfrage könnte so etwas wie

select offers.* from offers 
left join another_table on another_table.field = offers.field 
where offer_id = ? 

Beachten Sie, dass offer_id in der obigen Tabelle auf eine Spalte in offers beziehen könnte oder another_table tun.

Was Sie tun sollten, um den Fehler zu korrigieren, ist die offer_id mit einem Tabellennamen voranstellen. Etwas wie dieses:

return $this->whereHas('offers', function($query) use ($offer_id) { 
    return $query->whereIn('other_table.offer_id', $offer_id); 
}); 
+0

Dank @ Jonathon Abfrage läuft jetzt, aber leere Daten zurück. (Obwohl es ein Ergebnis geben sollte) Hoffe, eine Ausgabe des SQL zu bekommen, um es von dort aus debuggen zu können. – StuBlackett

+0

@StuBlackett Sie können [Abfrageereignisse abhören] (https://laravel.com/docs/5.3/database#listening-for-query-events). – Doom5

+0

@StuBlackett Sie können auch eine Kombination aus '\ DB :: enableQueryLog()' verwenden, bevor Sie irgendwelche Abfragen ausführen und '\ DB :: getQueryLog()' danach, um zu sehen, was ausgeführt wurde :) – Jonathon