2016-10-01 7 views
2

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

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 методы в этом случае ...

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

ответ

0

Вы должны вызвать Save() вместо ассоциированных():

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

или saveMany(), что внутренне называют Save() для коллекции моделей:

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

Я попробовал используя метод 'save' до публикации здесь, но похоже, что этот метод не может« связывать »элементы со счетом-фактурой. 'Нарушение ограничения целостности: 1048 Столбец 'invoice_id' не может быть null (SQL: обновить' items' set 'invoice_id' =,' updated_at' = 2016-10-01 00:00:00 где 'id' = 1)' –

+0

Также если я использую ваш второй метод с 'SaveMany', выдает следующую ошибку:' Метод saveMany не существует. 'Похоже, что его опечатка во втором методе должна быть:' $ copy-> items() -> saveMany ($ invoice- > элементы); '? В этом случае та же ошибка, что и для первого метода ... –

+0

Я также попытался установить значение NULL как значение по умолчанию для поля invoice_id, и процедура была закончена, но, как я подозревал, он просто создал элементы с полем NULL invoice_id (I задается вопросом, будет ли это поле заполняться впоследствии). –

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