2014-02-25 8 views
14

Ich versuche, eine polymorphe Eins-zu-Eins-Beziehung (das polymorphe Äquivalent von has_one und gehört_to) einzurichten. Ich habe ein Address Modell, und es gibt mehrere andere Modelle, die ich eine Adresse haben möchte. Ich bin jedoch verwirrt über den Wortlaut der Dokumente. Ich habe die morphMany Methode gesehen, aber meine Frage ist: soll ich morphMany obwohl ich mag es nur eine Adresse haben, oder gibt es so etwas wie eine morphOne Methode soll ich verwenden?Laravel Eloquent polymorphen one-to-one?

EDIT: Mein Address Modell diese Felder hat, einfach zu visualisieren helfen:

Schema::create('addresses', function ($table) 
{ 
    $table->increments('id'); 
    $table->string('street'); 
    $table->string('street_more')->nullable(); 
    $table->string('city'); 
    $table->string('state')->nullable(); 
    $table->string('country'); 
    $table->string('postal_code'); 
    $table->integer('addressable_id'); 
    $table->string('addressable_type'); 
}); 
+0

Dies ist nicht das Modell. Dies ist die Migration. –

+0

@DennisBraga Ich meinte die Struktur des Modells. Danke, dass du das erwischt hast! Ich habe es in der Post geklärt. – BenjaminRH

Antwort

20

Ja, es ist eine morphOne Methode und ich denke, das ist, das Sie in diesem Fall benutzen sollen: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L811.

Sie können auch

$table->morphs('addressable'); 

statt

$table->integer('addressable_id'); 
$table->string('addressable_type'); 

ich verwendet habe, für L4 in einem benutzerdefinierten Paket morphOne verwenden und funktioniert ziemlich gut.

+3

Das ist großartig! Es ist dann nur nicht dokumentiert. Vielen Dank. Re: '$ table-> morphs', ich finde es besser lesbar, sie dort selbst zu stecken, aber danke :) – BenjaminRH

+2

Danke für die Antwort. Ich denke, die Funktion jetzt „morphOne“ genannt wird https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php#L792 –

1

versuchen diese, ich denke, das als morphOne besser ist, dass nicht unterstützt.

public function address() 
    { 
     return $this->hasOne('App\Address', 'addressable_id','id') 
        ->where('addressable_type', 'App\Model'); 
    }