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