【问题标题】:Return values only (no keys/associative array) in Laravel在 Laravel 中仅返回值(无键/关联数组)
【发布时间】:2016-05-23 23:24:24
【问题描述】:

情况

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

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

【问题讨论】:

    标签: php arrays laravel eloquent query-builder


    【解决方案1】:

    方法:

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

    在 laravel 5.4 之后不再是一个选项

    可能的解决方法是https://github.com/awesomedeba10 在此处建议: https://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。

    【讨论】:

      【解决方案2】:

      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 的帮助下,此常量在 select() 函数最后一行的 Illuminate/Database/Connection.php 文件中传递给 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(),所以我们只需要接收连接器就可以设置它。根据documentation

      当使用多个连接时,您可以通过DB 门面的connection 方法访问每个连接。

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

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

      【讨论】:

      • 不再支持,报错:Call to undefined method Illuminate\Database\MySqlConnection::setFetchMode()
      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2015-07-23
      • 2023-03-06
      • 2020-09-04
      • 1970-01-01
      • 2019-05-11
      • 2018-02-12
      相关资源
      最近更新 更多