Laravel 5.1 DB:选择toArray()

时间:2016-05-30 04:42:17

标签: laravel laravel-5 eloquent laravel-5.1

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

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

例如

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

我希望结果是一个数组 - 但是现在它返回一个像这样的结构,一个带有Objects的数组......

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...

13 个答案:

答案 0 :(得分:23)

好像你需要将stdClass对象转换为数组,这样你才能拥有你想要的结构

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

答案 1 :(得分:16)

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

// 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);

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

答案 2 :(得分:9)

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

  

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

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

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

要使用此方法,请使用Eloquent:

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

答案 3 :(得分:2)

对于laravel / lumen 5.4(使用illuminate /数据库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?

答案 4 :(得分:1)

试试这个

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

答案 5 :(得分:1)

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

  foreach($category as $val) {
      $name = $val['name'];            //prints car
      foreach($name as $value) {       //how to map $name to the 'car' array that is passed from controller. It say invalid argument supplied for foreach

      }
  }

它有效,我查了一下。

答案 6 :(得分:1)

您可以进行收集以使用toArray(),这是非常简单的方法:

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

答案 7 :(得分:0)

你可以这样做..

在顶部

//div[count(*[name() != 'figure']|text()[normalize-space()]) = 0]

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

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'];

答案 8 :(得分:0)

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

200

答案 9 :(得分:0)

你可以试试这个

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

答案 10 :(得分:0)

一种棘手且简单的方法:

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

也许会对您有帮助

答案 11 :(得分:0)

您可以使用这个。对我有用。

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

答案 12 :(得分:0)

这个问题在互联网上广为流传,Laravel 的人应该考虑将解决方案包含在框架中。 我正在使用这个黑客。

    $arrayOfObjects   = DB::select("select attribute_name from table_name");
    $arrayOfValues    = array_column( $arrayOfObjects, 'attribute_name' );