2017-01-19 2 views
0

Ich habe ein nächstes Modell:Laravel 5.3 belongsToMany return null, Pivot-Daten

class Product extends Model{ 
    protected $table = 'products'; 

    public function payments() 
    { 
     return $this->belongsToMany('App\Payment', 'payment_product', 'product_id', 'payment_id') 
    } 
} 

class Payment extends Model{ 
    protected $table = 'payments'; 

    public function products(){ 
     return $this->belongsToMany('App\Product'); 
    } 
} 

Pivot Tabelle: payment_product (id, product_id, payment_id)

Eloquent

public function details($id){ 
     $product = Product::with('payments')->find($id); 
     dd($product->payments); // return null 
     return view('products.details', ['product' => $product]); 
    } 

Ich brauche bringen Sie eine foreach, aber $ product-> Zahlungen ist null. Warum das ? Alle Tabellen sind nicht leer.

UPD Sub-Abfrage $ this-> belongsToMany ('App \ Payment', 'payment_product', 'product_id', 'payment_id'); Ergebnisse:

enter image description here

+3

Nur ein FYI, weil Sie Namenskonvention die folgenden sind Laravel Sie die Tabellennamen nicht angeben müssen/Spalten in Ihrer Beziehungen. –

Antwort

1

Versuch:

public function payments() 
{ 
    return $this->belongsToMany('App\Payment', 'payment_product', 'payment_id', 'product_id') 
} 

Ich glaube, Sie haben Ihre FK in der falschen Reihenfolge.

In der Tat, ich glaube nicht, dass Sie etwas mehr angeben müssen als:

public function payments() 
{ 
    return $this->belongsToMany('App\Payment') 
} 
+0

OP verwendet die richtige Reihenfolge, Sie nicht. –

+0

Ich habe versucht, öffentliche Funktion Zahlungen() { Rückgabe $ this-> AngleToMany ('App \ Payment'); } Nicht arbeiten –

1

Sieht aus wie Sie schließen sich zwei Tabellen basierend auf nicht verwandten Feldern.

Wenn Sie

return $this->belongsToMany('App\Payment', 'payment_product', 'product_id', 'payment_id') 

Tisch tun products Innen wird mit payment_product auf
products.product_id = payment_product.payment_id verbunden. Aber ich denke, diese beiden Spalten sind nicht die verwandten Schlüssel. Fügen Sie stattdessen in Ihrer Tabelle payment_product mit der product_id in dieser Tabelle products.product_id hinzu. Das könnte funktionieren.

+0

Modell Zahlung und Produkt hat geschützt $ primaryKey = 'id'; $ product = Produkt :: mit ('payments') -> find ($ id); dd ($ product-> relationsToArray();); Array: 1 [▼ "Zahlungen" => Array: 2 [▼ 0 => Array: 7 [▶] 1 => Array: 7 [▶] ] ] Das gut. Aber foreach ($ product-> Zahlung als $ Zahlung) {...}, Fehler: ungültiges Argument für Foreach geliefert –

+0

die Abfrage gibt keine Ergebnisse zurück. Führen Sie den gleichen rohen SQL-Befehl in mysql-Terminal aus und sehen Sie, ob Sie dort Ergebnisse erhalten. Wenn nicht, werden Sie wahrscheinlich falsch beitreten. –

0

Zahlungen umbenennen payments_method:

public function payments_method(){ 
    return $this->belongsToMany('App\Payment'); //or ('App\Payment', 'payment_product', 'payment_id', 'product_id') 
} 

$product = Product::find($id); 
$product->payments_method; //this is work 

Das ist Magie :)