【发布时间】:2016-10-01 22:52:34
【问题描述】:
(看起来我解决了我自己的问题,如果有人可以回答 Update 1 中的问题并检查我自己的解决方案以解决 Update 2 中的问题。谢谢.)
尝试使用相关项目克隆发票模型。
收到 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 之前,应首先保存父克隆模型以接收 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']);
}
【问题讨论】:
标签: php laravel laravel-5 eloquent belongs-to