2016-04-06 10 views
0

In meiner Laravel-Anwendung kann ich mit dem folgenden Setup neue Eltern und Kinder erstellen?Erstellen neuer polymorpher Beziehungen

class Parent extends Model 
{ 
    public function extended() 
    { 
     return $this->morphTo(); 
    } 
} 

class Child extends Model 
{ 
    public function extendedFrom() 
    { 
     return $this->morphOne('App\Parent', 'extended'); 
    } 
} 

class CreateParentsTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('parents', function (Blueprint $table) { 
      $table->increments('extended_id'); 
      $table->string('extended_type'); 
     }); 
    } 
} 

class CreateChildrenTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('children', function (Blueprint $table) { 
      $table->unsignedInteger('id'); 
     }); 

     Schema::table('children', function (Blueprint $table) { 
      $table->foreign('id') 
       ->references('extended_id')->on('parents') 
       ->onDelete('cascade'); 
     }); 
    } 
} 

ich versucht habe

$parent = new Parent(); 
$parent->save(); 
$child = new Child(); 
$parent->extended()->save($child); 

Aber das gibt dem folgenden Fehler

BadMethodCallException in Builder.php Linie 2161:
Call to undefined Methode Illuminate \ Database \ Abfrage \ Builder :: save()

Antwort

1

Wenn Sie die API hier https://laravel.com/api/5.2/ betrachten und nach morphTo suchen, können Sie sehen, dass es ein MorphTo Objekt zurückgibt. https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Relations/MorphTo.html

Wenn Sie dann die Methoden für diese Klasse durchsehen, können Sie sehen, dass es für diese Klasse keine Methode save gibt. Die Methode, die Sie wahrscheinlich suchen, ist associate

Mit diesem gesagt, versuchen Sie Folgendes.

$parent->extended()->associate($child); 

Ihr Schema scheint auch gebrochen zu sein. extended_id kann nicht Ihr Primärschlüssel (der automatisch über die increments-Funktion festgelegt wurde) und die ID des Kindes sein. Er benötigt eine id-Säule, die auto_incrementing ist, und entfernt auto_incrementing von extended_id.

Denken Sie darüber nach, dies ist polymorph, so dass mehrere Arten von Kindern potenziell die gleiche id s haben können. In diesem Fall könnte jeder Elternteil möglicherweise nur 1 Kind haben, da die Spalte extended_id eindeutig ist.

Durch Hinzufügen der id Spalte, so dass es Primärschlüssel und automatische Inkrementierung und Einstellung extended_id auf nur unsigned not null hat für mich gearbeitet und es wird entsprechend gespeichert.

Ich würde auch einen Blick in Ihre Datenbankeinstellungen werfen. Was Sie zuvor hatten, sollte SQL-Fehler generieren, da dies mit dem von Ihnen eingerichteten Fremdschlüssel nicht möglich gewesen wäre. Möglicherweise ignorieren Sie irgendwo Fremdschlüsselüberprüfungen.

+0

Verwenden, was ich schrieb mit $ $ parent-> extended() -> associate ($ Kind); 'anstelle von $ parent-> extended() -> speichern ($ Kind);' gefolgt von '$ Eltern- > save() 'führt zu einem neuen Elternteil mit der ID 0 und keinem untergeordneten Objekt. –

+0

Außerdem fügt '$ child-> extendedFrom() -> save ($ parent)' und '$ child-> save()' das untergeordnete Element hinzu, aber die ID ist immer 0, obwohl die übergeordnete Spalte eine Spalte für automatisches Inkrement ist. –

+0

'associate' darf das' child' nicht speichern. Versuchen Sie '$ Kind-> save()' – user3158900