Laravel 5.4的updateOrCreate方法不起作用。

4

我有什么:

发票发票项目模型,它们之间具有hasManybelongsTo关系。 发票可以有多个发票项目,而一个发票项目仅属于其发票。这是基本的一种。

情况: 创建工作正常。 但是,当我尝试使用标准的createOrUpdate更新现有发票时,会发生以下情况。

  1. 如果未创建新行,则可以更新现有发票。
  2. 如果我添加了新的发票项目,则会出现Undefined index: id错误。

这是我如何使用createOrUpdate:

$invoice->update($invoiceRequest->except('items'));

foreach($items as $item) {
        $invoice->invoiceitem()->updateOrCreate(['id'=> $item['id']],$item);
}

这里我到底缺了什么?

下面是我的 $items 变量的样子

 {
 "id": "1",
 "invoiceable_id": "3",
 "fiscal_id": "2",
 "itemdue": "2018-01-19",
 "description": "a",
 "amount": "1000"
 },
 {
 "id": "2",
 "invoiceable_id": "2",
 "fiscal_id": "2",
 "itemdue": "2018-01-20",
 "description": "b",
 "amount": "1000"
 },
 {
 "id": "3",
 "invoiceable_id": "3",
 "fiscal_id": "2",
 "itemdue": "2018-01-19",
 "description": "c",
 "amount": "1200"
 },
 {
 "invoiceable_id": "1",
 "fiscal_id": "1",
 "itemdue": "2018-01-24",
 "description": "renewals",
 "amount": "100"
 }

需要更新带有id的项目,而没有id的最后一个项目应该作为新行创建。请问我错在哪里?如果您需要更多信息,请告诉我。


在控制器中(在您提供的代码行之前),您是如何定义$items的?我处于类似的情况,我想看看您如何设置updateOrCreate,因为这对我来说是新领域。 - Matthew
@Matthew 我的已经排好序了,我们来解决你的问题。主要问题似乎是新的发票项目中缺少'id'。你可以将id字段留空并保存它,或者像我一样使用'id' => isset($item['id']) ? $item['id'] : 0。这对我有用。如果需要帮助,请告诉我。 - ashish
1个回答

2

$items中的最后一个元素没有id属性:

{
    "invoiceable_id": "1",
    "fiscal_id": "1",
    "itemdue": "2018-01-24",
    "description": "renewals",
    "amount": "100"
}

这就是为什么$item['id']会给你报错。

你可能想要用类似下面的方式来检查数据:

if (isset($item['id']))

1
这个项目是新添加的,所以它没有ID。这就是我的问题所在。我想创建这个项目。为了创建新项目,ID并不是必需的。 - ashish
好的,您需要遍历集合并且$item['id']抛出了错误。您需要添加我在更新的答案中展示的检查。 - Alexey Mezenin
我是否应该使用建议条件的IF来分别执行创建和更新?您能否进一步提供建议? - ashish
1
@ashish 如果您想在ID为空时创建新记录,请使用'id' => isset($item['id']) ? $item['id'] : 0而不是 $item['id'] - Alexey Mezenin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接