2017-03-06 5 views
1

Ich kann nicht in Eloquent denken, wie man damit umgeht. Ich habe eine Viele-zu-Viele-Beziehung, die eine Eins-zu-Eins-Beziehung erfordert.LARAVEL: Eins-zu-eins-Beziehung auf einem Pivot-Tisch?

Hier ist die grundlegende Datenbankstruktur I in seiner einfachsten Form entworfen:

ACCOUNTS: id 

AGENTS: id 

FEES: id 

ACCOUNT_AGENT: account_id, agent_id, fee_id 

Jedes Konto belongsToMany Agents.

Jeder Agent gehört zu mehreren Konten.

Jeder "Account_Agent" (die Viele-zu-Viele-Pivot-Tabelle) gehört zu Fee.

Wie definiere ich diese dritte Beziehung in einem beredten Modell?

Ich möchte wie dies die „account_agent“ Gebühr zugreifen können (oder ähnlich):

$account = Account::first(); 

foreach ($account->agents as $agent) { 
    echo $agent->fee; 
} 

Danke, hoffentlich meine Frage klar.

+0

Dies könnte hilfreich sein: http://stackoverflow.com/questions/30649810/Three-Way-Many-To-Many-Relationship-in-Laravel – Samsquanch

Antwort

2

Siehe hier:

https://laravel.com/docs/5.4/eloquent-relationships#many-to-many

Blättern Sie zum Definieren von benutzerdefinierten Zwischentisch Modelle

Im Grunde, was Sie tun müssen, ist eine Klasse wie folgt zu definieren:

class AccountAgent extends Illuminate\Database\Eloquent\Relations\Pivot 
{ 
    /** 
    * Many:1 relationship with Fee model 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 
    */ 
    public function fee() 
    { 
     return $this->belongsTo(Fee::class); 
    } 
} 

Dann definieren Sie Ihre Viele-Viele-Beziehung in Ihrer Account-Klasse wie folgt:

/** 
* The agents that belong to the account. 
*/ 
public function agents() 
{ 
    return $this->belongsToMany(Agent::class)->using(AccountAgent::class); 
} 

dann in Ihrem Code, statt dies:

foreach ($account->agents as $agent) { 
    echo $agent->fee; 
} 

... dies tun:

foreach ($account->agents as $agent) { 
    /** @var Fee $fee_object */ 
    $fee_object = $agent->pivot->fee; 
} 

In dieser Schleife $ fee_object ist der Klassengebühr (Modellklasse, die deckt die Gebühren-Tabelle), so können Sie echo $fee_object->fee_amount oder was auch immer andere Spalten Sie verwenden müssen.

+0

Vielen Dank. Ich dachte, das Erstellen eines Modells für den Pivot-Tisch war der Weg zu gehen, aber ich wusste einfach nicht genau, wie es gemacht wurde :) –

+0

Gern geschehen. Ich werde sagen, dass ich mich selbst zurückhalten musste, wenn ich darauf hinwies, dass man, wenn man eine Klasse namens "Fee" hat, auch weitere Klassen namens "Fie", "Foe" und "Fum" braucht. :) – delatbabel

Verwandte Themen