Laravel中仅返回值(无键/关联数组)

时间:2016-02-12 17:39:08

标签: php arrays laravel eloquent query-builder

情况

我有以下代码将所有数据作为数组获取:

Data::select('id', 'text')->get()->toArray();

这将以以下格式返回数据:

array:1 [
  0 => array:2 [
    "id" => "1"
    "text" => "Stack"
  ]
  1 => array:2 [
    "id" => "2"
    "text" => "Overflow"
  ]
]

但是我只希望将值作为常规数组(没有键/关联数组),因此当我将数组转换为JSON时,数组不会转换为对象:

array:1 [
  0 => array:2 [
    0 => "1"
    1 => "Stack"
  ]
  1 => array:2 [
    0 => "2"
    1 => "Overflow"
  ]
]

解决方案不足

我知道我可以用循环转换它并使用array_values(),但前者不是单行,而第二个只适用于一个级别而不适用于数组数组。

此外,我正在寻找一种方法来配置" Eloquent / Query Builder,而不是转换一次返回结果的方法。

问题

是否有设置或方法可以使用Eloquent / Query Builder 执行

2 个答案:

答案 0 :(得分:1)

TL; DR

告诉PDO以这种方式工作:

DB::connection()->setFetchMode(PDO::FETCH_NUM);
Data::select('id', 'text')->get()->toArray();
DB::connection()->setFetchMode(PDO::FETCH_OBJ;);

不要忘记设置默认值或以前的设置。您还需要使用这些外墙:

use DB;
use PDO;

详情(幕后)

这是通过基础PDO本身控制的,可以通过fetch_style控制。我们需要的常数就是这个:

  

PDO :: FETCH_NUM:返回一个数组索引的数组,该数组在结果集中返回,从第0列开始

现在我们只需要以Laravel的方式传递它。在getter的帮助下,此常量在Illuminate/Database/Connection.php函数的最后一行的select()文件中传递给PDO:

public function select($query, $bindings = [], $useReadPdo = true)
{
    return $this->run($query, $bindings, function ($me, $query, $bindings) use ($useReadPdo) {
        if ($me->pretending()) {
            return [];
        }

        // For select statements, we'll simply execute the query and return an array
        // of the database result set. Each element in the array will be a single
        // row from the database table, and will either be an array or objects.
        $statement = $this->getPdoForSelect($useReadPdo)->prepare($query);

        $statement->execute($me->prepareBindings($bindings));

        return $statement->fetchAll($me->getFetchMode());
    });
}

当然还有一个公共设置器:setFetchMode(),所以我们只需要接收连接器,我们就可以设置它。根据{{​​3}}:

  

使用多个连接时,您可以通过connection外观上的DB方法访问每个连接。

所以我们有一切可以做到这一点:

DB::connection()->setFetchMode(PDO::FETCH_NUM);

答案 1 :(得分:0)

laravel 5.4 之后不再提供选项

可能的解决方法如此处建议的 https://github.com/awesomedeba10https://github.com/laravel/framework/issues/17557#issuecomment-536879106

您可以在配置中添加具有默认值的 .env 变量。

config/database.php:

fetch_mode => env('DB_FETCHMODE', 'FETCH_OBJ');

.env:

FETCH_MODE=FETCH_OBJ

然后在Illuminate/Database/Connection.php>准备

添加:

$statement->setFetchMode($config['fetch_mode'] == "FETCH_OBJ" ? 5 : ($config['fetch_mode'] == "FETCH_NUM" ? 3 : 2));

插入:

$this->fetchMode

然后你可以覆盖你的配置:

config()->set('database.connections.mysql.fetch_mode', 'FETCH_NUM');

这将保持获取模式全局默认的 FETCH_OBJ,但您仍然可以在需要时切换到 FETCH_NUM。