我正在使用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
)
)
)
那么有什么方法可以克服此选项,并将查询结果作为数组来处理?
答案 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);
我仍在寻找最好的方法,但到目前为止,这种调整对我有用:)