我有这个问题:
$models = DB::select(DB::raw("SELECT
Count(collected_items.id) AS total_collected,
///some stuff
FROM collected_items
///some inner joins
WHERE
///Some clauses
GROUP BY collected_items.clause"));
在laravel 5.5中,查询构建器返回一个对象数组。
现在我无法循环到结果$模型。错误:Cannot use object of type stdClass as array
foreach($models as &$model){
$model['picture'] = '/images/models/' . $model['picture'];
}
如何获得一组关联数组呢?我以前使用setFetchMode来获取它但是这不能再做了(很容易)所以我删除了它,现在我正在获取对象。我还能够通过在循环中添加$model = get_object_vars($model);
来恢复功能:
foreach($models as &$model){
$model = get_object_vars($model);
$model['picture'] = '/images/models/' . $model['picture'];
}
但是我想知道这是否是正确的做法,或者是否有更好的方法直接从查询中获取关联数组,使用雄辩...
结果:
foreach($models as $i){
print_r($i);
}
是:
stdClass Object
(
[total_collected] => 10
[data] => data
[id] => 218
//...
)
dd($models)
的结果是:
array:1 [
0 => {#327
+"total_collected": 10
+"data": "data"
+"id": 218
//...
}
]
所以结果似乎是一个对象数组。
尝试在查询末尾添加->get();
会导致错误:
Call to a member function get() on array
答案 0 :(得分:0)
据我所知,Eloquent真的希望你使用对象语法:
$i->total_collected;
而不是使用数组。当我想使用数组时,你使用get_object_vars()是解决这个问题的方法......我从来没有找到任何"标准"为什么这不好,或者采用正确方法解决这个问题的另一种最佳做法。所以你可以做到
$this_row_array = get_object_vars($i);
$this_row_array['total_collected'];
据我所知,这是完全合法的。
当Eloquent变得更聪明时,这种答案可能会黯然失色,但鉴于你的问题针对5.5,我认为你已经有了正确的答案。
HTH,
-FT