我有以下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版。
答案 0 :(得分:9)
首先,您在代码中遗漏了get()
,因此:
1 您正在迭代Query\Builder
而不是结果数组,因为您从未执行过查询。 (我想你只是在这里忘了它,因为否则你可能会得到trying to get property of non-object
)
或 2 其中一行在''
列中有null
或field_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] = [];
你可能需要根据自己的需要进行调整,但是你明白了。