【问题标题】:Laravel 5.1 DB:select toArray()Laravel 5.1 DB:选择 toArray()
【发布时间】:2016-09-27 19:33:41
【问题描述】:

我有一个大型 SQL 语句,我正在执行如下:

$result = DB::select($sql);

例如

$result = DB::select('select * from users');

我希望结果是一个数组 - 但目前它返回一个像这样的结构,一个带有对象的数组...

Array
(
    0 => stdClass::__set_state(array(
        'id' => 1,
        'first_name' => 'Pavel',
        'created_at' => '2015-02-23 05:46:33',
    )),
    1 => stdClass::__set_state(array(
        'id' => 2,
        'first_name' => 'Eugene',
        'created_at' => '2016-02-23 05:46:34',
    )),
...etc...

)

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-5.1


    【解决方案1】:

    似乎您需要将 stdClass 对象转换为数组,以便您可以拥有您正在寻找的结构

    $result = array_map(function ($value) {
        return (array)$value;
    }, $result);
    

    【讨论】:

    • 好主意!您确定 Eloquent 不提供执行此操作的功能吗?
    • Eloquent 做到了,但你使用的是 Query Builder,而不是 Eloquent
    【解决方案2】:

    着眼于性能的最佳解决方案是改变从数据库中获取数据的方法:

    // get original model
    $fetchMode = DB::getFetchMode();
    // set mode to custom
    DB::setFetchMode(\PDO::FETCH_ASSOC);
    // get data
    $result = DB::select($sql);
    // restore mode the original
    DB::setFetchMode($fetchMode);
    

    显然,如果您想将所有数据作为数组获取,则在config/database.php中更改就足够了:

    'fetch'       => PDO::FETCH_CLASS,
    

    进入

    'fetch'       => PDO::FETCH_ASSOC,
    

    然后只运行:

    $result = DB::select($sql);
    

    将返回多维数组而不是对象数组

    【讨论】:

    • 这真的很高级。谢谢。
    • 我找到了与这个主题相关的答案,我认为这可以改善@Marcin 的建议。 stackoverflow.com/a/19369644/2848140
    • 我在 Laravel 5.4 中收到此错误:Call to undefined method Illuminate\Database\MySqlConnection::getFetchMode()
    • 这正是我所寻找的。谢谢。
    • 我在 Laravel Framework 8.26.1 中遇到了这个错误——调用未定义的方法 Illuminate\Database\MySqlConnection::setFetchMode()
    【解决方案3】:

    toArray() 方法将集合转换为数组。模型也转换为数组:

    toArray 方法将集合转换为普通的 PHP 数组。 如果集合的值为 Eloquent 模型,模型也将 转换为数组

    所以,我猜你做错了什么。如果您需要更多帮助,请使用所有相关代码更新您的问题。

    另外,只有 Eloquent 集合(模型)有 toArray() 方法。

    要使用这种方法,请使用 Eloquent:

    $result = \App\User::all()->toArray();
    

    【讨论】:

    • $result = DB::select($sql)->toArray();
    • 异常 'Symfony\Component\Debug\Exception\FatalErrorException' 带有消息 'Call to a member function toArray() on array' in ...
    • @YevgeniyAfanasyev,我想这就是Aimee代码的答案。当然它不会起作用。请出示您的代码,我将向您展示如何将其转换为数组。
    • 我扩展了这个问题,我把例子放在那里。谢谢。
    • @YevgeniyAfanasyev,我已经用等效于 $result = DB::select('select * from users'); 的 Eloquent 代码更新了我的答案
    【解决方案4】:

    这是另一种值得一提的方法:

    $resultArray = json_decode(json_encode($result), true);
    

    【讨论】:

    • 除了听lister laravel之外,这只是一种方式,太难过啦。
    【解决方案5】:

    对于 laravel/lumen 5.4(使用Illuminate/database 5.4):

    $pdo = DB::getPdo();
    $statement = $pdo->prepare($yourQuery);
    $statement->setFetchMode(\PDO::FETCH_ASSOC);
    $statement->execute();
    $results = $statement->fetchAll();
    

    或者监听 Illuminate\Database\Events\StatementPrepared 事件:Laravel 5.4 - How to set PDO Fetch Mode?

    【讨论】:

      【解决方案6】:

      你可以试试这个

      DB::table('commune')->where('Commune','<>', 'ND')->orderBy('Commune')->get()->pluck('Commune');
      

      【讨论】:

        【解决方案7】:

        试试这个

        $result = DB::select($sql);
        $arr = [];
        foreach($result as $row)
        {
            $arr[] = (array) $row;
        }
        

        【讨论】:

        • 这是错误的。我得到:local.ERROR: 异常 'Symfony\Component\Debug\Exception\FatalErrorException' 并带有消息 'Call to a member function get() on array'
        • 更新异常 'ErrorException' 带有消息 'call_user_func_array() 期望参数 1 是一个有效的回调,类 'Illuminate\Database\MySqlConnection' 没有方法 'selectRaw''
        • @huuuk,select 不仅接受列名:$users = DB::select('select * from users where active = ?', [1]); - 此外,您的示例也不起作用。要让最后一个得到一些东西,你需要删除-&gt;get()
        • @AlexMezenin 对不起,我错了。你说的对。我有点困惑Eloquent
        【解决方案8】:

        你可以这样做..

        在顶部

        use DB;
        use PDO;
        
        --------------------
        
        DB::setFetchMode(PDO::FETCH_ASSOC); // Set the fetch mode as array
        
        $result = DB::select('select * from users');
        

        例如,现在你可以这样得到结果。

        $first_email = $result[0]['email'];
        

        现在您可以更改为默认提取模式。

        DB::setFetchMode(PDO::FETCH_CLASS);
        

        【讨论】:

          【解决方案9】:

          你可以用这个。它对我有用。

          $query = DB::table('user')->select(['id','name'])->get();
          $userlist = $query->toArray();
          

          【讨论】:

            【解决方案10】:

            你可以做一个收藏以便使用toArray(),方法很简单:

            $result = DB::table('users')->get();
            $data = collect($result)->map(function($x){ return (array) $x; })->toArray(); 
            

            【讨论】:

            • 接受的答案使用相同的 array_map-ing 概念,但没有额外的与集合之间的转换。恐怕你贡献不大。
            【解决方案11】:

            一个棘手而简单的方法:

            //Got array in stdClass converting to JSON
            $temp1= json_encode($result);
            
            
            //JSON to Array
            $temp2= json_decode($temp1,1);`
            

            也许对你有帮助

            【讨论】:

            • 我在 2016 年 5 月 30 日 5:44 以同样的方式回答。你有点晚了。请在发布之前阅读现有答案。
            【解决方案12】:

            最简单的方法是使用 laravel toArray 函数:

            public function toArray()
            {
                return array_map(function ($value) {
                    return $value instanceof Arrayable ? $value->toArray() : $value;
                }, $this->items);
            }
            

            【讨论】:

            • toArray() 是方法,而不仅仅是函数。并将集合转换为数组。我没有初学者的集合,我有一个对象数组。只是因为 DB::select($sql);返回对象数组。所以你的回答没有帮助。
            猜你喜欢
            • 2015-10-02
            • 2018-11-18
            • 2016-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-17
            • 2020-12-16
            • 2016-10-05
            相关资源
            最近更新 更多