将Illuminate \ Support \ Illuminate \ Database默认数据库返回类型的集合更改为数组版本5.8

时间:2019-08-01 14:06:36

标签: php laravel eloquent laravel-5.8

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

下面是我现有的查询,在旧版本中运行正常

->toArray()

如果需要解决此问题,则需要修改查询,如下所示:

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

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

如果我不使用toArray()方法,那么结果将包装在

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

我要求如下:

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

那么有什么方法可以克服此选项,并将查询结果作为数组来处理?

2 个答案:

答案 0 :(得分:0)

不,没有。几个月前,我一直在研究这种情况,并得出结论,查询构建器是hard-wired来返回集合。

您可以为查询生成器创建一个宏,但仍必须编辑所有查询以使用新的宏功能。

答案 1 :(得分:0)

我提出了一个解决方案,方法是将\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);

我仍在寻找最好的方法,但到目前为止,这种调整对我有用:)