2016-04-06 5 views
0

В моем приложении Laravel, как я могу с помощью следующей настройки создать новых родителей и детей?Создание новых полиморфных отношений

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'); 
     }); 
    } 
} 

Я попытался

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

Но что дает следующую ошибку

BadMethodCallException в Builder.php линии 2161:
Вызов неопределенной метод Осветите \ Database \ Query \ Builder :: save()

ответ

1

Если вы посмотрите на API здесь https://laravel.com/api/5.2/ и найдите morphTo, вы увидите, что он возвращает объект MorphTo. https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Relations/MorphTo.html

Если вы затем просмотрите методы в этом классе, вы увидите, что в этом классе нет метода save. Этот метод, который вы, вероятно, ищете, является associate

С учетом этого попробуйте следующее.

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

Ваша схема также, кажется, сломана. extended_id не может быть вашим основным ключом (который автоматически устанавливался через функцию increments) и идентификатором дочернего элемента. Он нуждается в колонке id, которая является auto_incrementing и удаляет auto_incrementing от extended_id.

Подумайте об этом таким образом, это полиморфно, поэтому несколько типов детей могут иметь одинаковые id. В этом случае каждый родитель может иметь только 1 ребенка, потому что столбец extended_id уникален.

Добавив столбец id, сделав его первичным ключом и автоматически увеличивая и установив extended_id только unsigned not null, работал для меня, и это экономит соответственно.

Я также ознакомился с настройками базы данных. Ранее вы должны были генерировать SQL-ошибки, потому что это не должно было быть возможно с помощью внешнего ключа, который вы установили. Вы можете игнорировать чужие чеки.

+0

Использование того, что я написал с помощью '$ parent-> extended() -> associate ($ child);' вместо '$ parent-> extended() -> save ($ child);' follow with $ $ parent- > save() 'приводит к созданию нового родителя с id 0 и не созданного дочернего элемента. –

+0

Также добавление '$ child-> extendedFrom() -> save ($ parent)' и '$ child-> save()' добавляет дочерний элемент, но id всегда равен 0, хотя родительский столбец является столбцом автоматического увеличения. –

+0

'associate' не должен сохранять' child'. После того, как вы свяжетесь, попробуйте '$ child-> save()' – user3158900

Смежные вопросы