2
(的hasMany相關的模型克隆模型看起來像我解決我自己的問題,如果只有一個人能在更新1回答問題,並檢查自己的問題解決在更新2,謝謝。 ) 嘗試克隆具有相關項目的發票模型。 獲取Call to undefined method Illuminate\Database\Query\Builder::associate()
錯誤。 任何幫助,非常感謝!在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
之前,應首先保存父克隆模型以接收ID。看起來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']);
}
我確實試過在發佈之前使用'save'方法,但看起來這種方法不能將項目與發票「關聯」。 '完整性約束違規:1048'invoice_id'列不能爲空(SQL:更新'items'設置爲'invoice_id' =,'updated_at' = 2016-10-01 00:00:00其中'id' = 1)' –
也如果我用'saveMany'的第二個方法拋出另一個錯誤:'saveManyMany不存在.'看起來像你的第二個方法中的錯字,應該是:'$ copy-> items() - > saveMany($ invoice- >項);'?在那種情況下,與第一個方法相同的錯誤... –
我也嘗試將NULL設置爲invoice_id字段的默認值,並且過程能夠完成,但正如我懷疑的那樣,它只是創建了帶有空的invoice_id字段的項(I想知道這個領域是否後來填充)。 –