【问题标题】:Indirect modification of overloaded element has no effect重载元素的间接修改没有效果
【发布时间】:2015-03-07 09:10:41
【问题描述】:

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

【问题讨论】:

    标签: php eloquent


    【解决方案1】:

    首先,您的代码中缺少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] = [];
    

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

    【讨论】:

    • 是的,我在这篇文章中省略了get()。固定的。添加了检查,但非空值仍然会产生此错误。
    • 我确实注意到,如果我切换到用字段数据填充另一个变量(例如$fields),然后在循环完成后执行$item['fields'] = $fields;,那么效果很好。这是我必须做的解决方法,但我仍然感到困惑,为什么首先需要这样做。
    • 可能就是这样。似乎适合我必须做的解决方法。出色的侦探工作!
    猜你喜欢
    • 2013-10-19
    • 2018-05-22
    • 2013-12-01
    • 2017-11-16
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多