在Laravel 5.3中使用hasMany相关模型克隆模型

时间:2016-10-01 22:52:34

标签: php laravel laravel-5 eloquent belongs-to

(看起来我解决了自己的问题,如果只有某人可以在更新1 中回答问题并在更新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方法。 我仍然感到困惑,为什么我在这种情况下使用associatepush方法......

更新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']);
}

1 个答案:

答案 0 :(得分:0)

您需要调用 save()而不是关联()

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

saveMany(),内部为一组模型调用 save()

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