将 Illuminate\database 默认返回类型的 Illuminate\Support\Collection 更改为数组版本 5.8

Posted

技术标签:

【中文标题】将 Illuminate\\database 默认返回类型的 Illuminate\\Support\\Collection 更改为数组版本 5.8【英文标题】:Change Illuminate\Support\Collection of Illuminate\database default return type to array version 5.8将 Illuminate\database 默认返回类型的 Illuminate\Support\Collection 更改为数组版本 5.8 【发布时间】:2019-12-10 03:55:00 【问题描述】:

我正在使用 laravel 的 Illuminate\Database 包作为我的核心 php 代码的独立数据库连接器。我正在尝试使用更新版本(即 5.8)升级代码,有趣的是,此包的新版本现在将查询结果返回为 \Illuminate\Support\Collection 对象。因此,我需要通过附加 ->toArray() 方法来更改我现有的查询。有什么方法可以将集合的默认返回类型转换为数组,或者任何中间件或挂钩将查询结果作为数组进行操作?

以下是我现有的查询,在旧版本中运行良好

$MYDBOBJ->db->table("user")->select("*")->where("status", 'Active')->get();

如果我需要解决这个问题,那么我需要修改我的查询,如下所示:

$MYDBOBJ->db->table("user")->select("*")->where("status", 'Active')->get()->toArray();

以上内容适用于新版本,但我需要在很多文件中进行更改。

如果我不使用 toArray() 方法,那么我会得到包含在

中的结果
Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => Array
                (
                    [something] => somestring
                )
        )
 )

我要求如下:

Array
(
    [0] => Array
        (
            [something] => somestring
        )
)

那么有什么办法可以克服这个选项并将查询结果作为一个数组来操作?

【问题讨论】:

【参考方案1】:

不,没有。几个月前,我自己一直在研究这个问题,并得出结论,查询生成器是 hard-wired 以返回一个集合。

您可以为查询构建器创建一个宏,但您仍然需要编辑所有查询才能使用新的宏功能。

【讨论】:

在这种情况下,我最终会将 toArray() 方法附加到每个查询而不是创建宏【参考方案2】:

我想出了一种解决方案,方法是使用新类扩展 \Illuminate\Database\Query\Builder 类并覆盖 get() 方法。 下面是扩展类代码:

<?php


namespace Illuminate\Database\Query;

use Illuminate\Database\Query\Processors\Processor;
use Illuminate\Support\Arr;

class QueryBuilder extends \Illuminate\Database\Query\Builder

    //@Override
    public function get($columns = ['*'])
    
        return $this->onceWithColumns(Arr::wrap($columns), function () 
            return $this->processor->processSelect($this, $this->runSelect());
        );
    

    public function pluckFromArrayColumn($queryResult, $column, $key)
    
        $results = [];

        if (is_null($key)) 
            foreach ($queryResult as $row) 
                $results[] = $row[$column];
            
         else 
            foreach ($queryResult as $row) 
                $results[$row[$key]] = $row[$column];
            
        
        return $results;
    

我只是删除了collect 函数调用并返回了结果。 我也通过覆盖它对pluckFromArrayColumn 做了同样的事情。 我还更改了 Illuminate/database/Connection.php 中的命名空间,如下所示:

use Illuminate\Database\Query\Builder as QueryBuilder;
//to
use Illuminate\Database\Query\QueryBuilder as QueryBuilder;

最后在连接设置部分,如下:

$dispatcher = new Illuminate\Events\Dispatcher;
            $dispatcher->listen(Illuminate\Database\Events\StatementPrepared::class, function ($event) 
                $event->statement->setFetchMode(PDO::FETCH_ASSOC);
            );
$capsule->setEventDispatcher($dispatcher);

我仍在探索最好的方法,但到目前为止,这个调整对我有用 :)

【讨论】:

以上是关于将 Illuminate\database 默认返回类型的 Illuminate\Support\Collection 更改为数组版本 5.8的主要内容,如果未能解决你的问题,请参考以下文章

Illuminate\Database\QueryException 找不到驱动程序

方法 Illuminate\Database\Eloquent\Collection::save 不存在

我收到此错误“传递给Illuminate Database Grammar :: parameterize()的参数1必须是类型

模拟 Illuminate\Database\Eloquent\Model

Illuminate\Database\QueryException:SQLSTATE[42000]:语法错误或访问冲突:1064

未定义的属性:Illuminate\Database\Query\Builder::$sessionId