间接修改重载元素没有效果

Indirect modification of overloaded element has no effect

我有以下 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.

首先,您的代码中缺少 get(),因此:

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

2其中一行在field_group_name列中有''null值。

这就是您的代码这样做的原因:

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

这导致了 Indirect modification ... 错误。

所以首先添加空值检查:

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

您可能需要根据自己的需要对其进行调整,但您明白了。