Модель клонирования с помощью hasMany связанных моделей в Laravel 5.3

(Похоже, я решил свою проблему, если бы кто-то мог ответить на вопрос в Обновление 1 и проверить мое собственное решение проблемы в Обновление 2. Спасибо.)
Попытка клонирования модели Invoice со связанными элементами.
Получение Call to undefined method Illuminate\Database\Query\Builder::associate() ошибка.
Любая помощь очень ценится!

Invoice.php

public function items(){
return $this->hasMany('App\Item');
}

Item.php

public function invoice(){
return $this->belongsTo('App\Invoice');
}

InvoiceController.php

public function copy(Invoice $invoice){
$copy = $invoice->replicate(['number']);
foreach($invoice->items as $item) $copy->items()->associate($item);
$copy->push();
return redirect('/invoices/' . $copy->id . '/edit')->with('alerts', ['Invoice has been copied']);
}

Обновление 1

Я полагаю, я понял это. Родительская клонированная модель должна быть сохранена в первую очередь для получения идентификатора перед вызовом saveMany на дочерних узлах. Похоже push Метод также не может быть использован здесь.
Я все еще озадачен, почему я использую пушку associate а также push методы в этом сценарии …

Обновление 2

Оказывается, этот метод не создавал клонированные элементы, а обновлял те, которые он пытался клонировать, что странно … То, что я сделал, это replicate элементы внутри цикла (репликация не существует в таких отношениях, как belongsTo). Итак, мой окончательный код:

public function copy(Invoice $invoice){
$copy = $invoice->replicate(['number', 'url_key']);
$copy->url_key = strtolower(str_random(8));
$copy->save();
foreach($invoice->items as $item) $copy->items()->save($item->replicate(['type_id']));
return redirect('/invoices/' . $copy->id . '/edit')->with('alerts', ['Invoice has been copied']);
}

2

Решение

Вам нужно позвонить спасти() вместо адъюнкт ():

$copy->items()->save($item);

или же saveMany () что внутренне вызывает спасти() для коллекции моделей:

$copy->items()->saveMany($invoice->items);
0

Другие решения

Других решений пока нет …