laravel 5.5从DB :: select(DB :: raw(“”))返回stdObj数组;

时间:2018-01-26 18:07:06

标签: arrays laravel collections eloquent

我有这个问题:

$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

1 个答案:

答案 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