间接修改重载元素无效

时间:2015-01-09 04:39:52

标签: php eloquent

我有以下Eloquent查询:

$item = Item::where('sku', $sku)->first();

在进入此查询后,我手动添加了各种元素,例如:

$item['total'] = $item['subtotal'] + $this->currentInventory();

如上所述修改对象的语句工作正常。

当我执行以下操作时,它将停止工作:

$item['fields'] = [];

$fields = DB::table('item_fields')->where('item_id', $item['id'])->get();

foreach ($fields as $f) {
    if (!isset($item['fields'][$f->field_group_name]))
         $item['fields'][$f->field_group_name] = [];

    $item['fields'][$f->field_group_name]['valid_values'] = DB::table('item_field_valid_values')->where('item_field_id', $f->item_field_id);
}

这会导致行$item['fields'][$f->field_group_name] = [];产生错误:

Indirect modification of overloaded element of Item has no effect

如何分配$item['fields'] = [],但是当我尝试将实际元素添加到$item['fields']数组时,我收到此错误?

PHP 5.6.0版。

1 个答案:

答案 0 :(得分:9)

首先,您在代码中遗漏了get(),因此:

1 您正在迭代Query\Builder而不是结果数组,因为您从未执行过查询。 (我想你只是在这里忘了它,因为否则你可能会得到trying to get property of non-object

2 其中一行在''列中有nullfield_group_name值。

这就是你的代码执行此操作的原因:

$item['fields'][NULL] = [];

这导致Indirect modification ...错误。

首先添加空值检查:

if ($f->field_group_name && ! isset($item['fields'][$f->field_group_name]))
     $item['fields'][$f->field_group_name] = [];

你可能需要根据自己的需要进行调整,但是你明白了。