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想知道这个领域是否后来填充)。 –