2016-09-22 11 views
1

Ich bin auf der Suche nach etwas Hilfe bei der Ausarbeitung der Eloquenz Beziehungen für meine Anwendung.Laravel Eloquent und 3 Tabelle Beziehung

Ich habe Migrationen für drei Tabellen erstellt.

| users  | | items  | | user_items | 
+-----------+ +-----------+ +------------+ 
| id  | | id  | | id   | 
| username | | name  | | user_id | 
           | item_id | 
           | qty  | 

Ich habe Setup einen eindeutigen Index für die user_items Tabelle, die Begrenzung 1 Benutzer-ID 1 Artikel-ID, aber mit einer Menge Spalte. Ich möchte Eloquent so einrichten, dass ich zwei Modelle, User und Item, habe. Wo könnte ich sagen:

$item = $user->items()->first(); 
$name = $item->name; 
$qty = $item->qty; 

Das Problem ist, ich versuche, wenn ich ein drittes Modell, UserItem muß herausfinden oder nicht.

Antwort

1

Was Sie hier tun, ist eigentlich eine M: M-Beziehungen, und Laravel Eloquent haben bereits Unterstützung für diese 0 ut of the box. Die Tabelle user_item, die Sie haben, wird als die Pivot-Tabelle bezeichnet.

So richten Sie Ihre Beziehung mit Eloquent ein.

// User class 
class User extends Eloquent { 

public items() { 
    return $this->belongsToMany(Item::class)->withPivot('qty'); 
} 

} 

class Item extends Eloquent { 
    public function users() { 
     return $this->belongsToMany(User::class)->withPivot('qty'); 
    } 
} 

Damit dies funktioniert, können Sie drei Migrationen benötigen:

  • eine für die Positionstabelle
  • eine für die item_user Tabelle

    • eine für die Benutzertabelle. In Eloquent besteht die Pivot-Tabelle aus den beiden Tabellennamen in alphabetischer Reihenfolge. mit einem Strich getrennt.
    • folgenden elterlichen Konventionen, wenn Sie die FK festlegen, um _id verwenden, wird Eloquent keine zusätzlichen Informationen benötigen. In Ihrem Fall sollte der FK in der Tabelle item_user also user_id bzw. item_id lauten.
    • Es ist kein ItemUser-Modell erforderlich. Sie können den Zapfen in der Beziehung zugreifen, indem Sie:
    $user = User::find(1); 
    $user->items[0]->pivot->qty; // retrieve the quantity 
    
  • +0

    Danke Exrakun, dass Pivot-Syntax ist genau das, was ich suchte. –

    Verwandte Themen