(Похоже, я решил свою проблему, если бы кто-то мог ответить на вопрос в Обновление 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']);
}
Вам нужно позвонить спасти() вместо адъюнкт ():
$copy->items()->save($item);
или же saveMany () что внутренне вызывает спасти() для коллекции моделей:
$copy->items()->saveMany($invoice->items);
Других решений пока нет …