2016-10-01 123 views
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']); 
} 

回答

0

你需要調用保存()代替助理()

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

saveMany()在內部調用保存()適用於一系列型號:

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

我確實試過在發佈之前使用'save'方法,但看起來這種方法不能將項目與發票「關聯」。 '完整性約束違規:1048'invoice_id'列不能爲空(SQL:更新'items'設置爲'invoice_id' =,'updated_at' = 2016-10-01 00:00:00其中'id' = 1)' –

+0

也如果我用'saveMany'的第二個方法拋出另一個錯誤:'saveManyMany不存在.'看起來像你的第二個方法中的錯字,應該是:'$ copy-> items() - > saveMany($ invoice- >項);'?在那種情況下,與第一個方法相同的錯誤... –

+0

我也嘗試將NULL設置爲invoice_id字段的默認值,並且過程能夠完成,但正如我懷疑的那樣,它只是創建了帶有空的invoice_id字段的項(I想知道這個領域是否後來填充)。 –