L5.4 中删除了自定义获取模式的功能,默认为 PDO::FETCH_OBJ。
升级指南指出您可以使用事件侦听器来覆盖它:
Event::listen(StatementPrepared::class, function ($event) {
$event->statement->setFetchMode(...);
});
我一生都无法理解如何实现这一点:
1) 我应该把代码放在哪里?我应该用
EventServiceProvider
注册吗?StatementPrepared
事件什么时候触发? (我只需要更改特定存储库功能的获取模式,而不是在全局范围内)。这是我的代码示例:
<?php
namespace App\Repositories\Backend;
use DB;
use PDO;
class SystemRepository
{
/**
* Get the connection status variables.
*
* @return array
*/
public function getConnectionStatus()
{
DB::connection('backend')->setFetchMode(PDO::FETCH_ASSOC);
$result = DB::connection('backend')
->select(DB::raw("
SHOW STATUS
WHERE Variable_name = 'Max_used_connections'
OR Variable_name = 'Max_used_connections_time'
OR Variable_name = 'Threads_connected'
"))
;
DB::connection('backend')->setFetchMode(PDO::FETCH_CLASS);
return $result;
}
}
谢谢!
转到:app/Providers/EventServiceProvider.php
将其添加到文件顶部:
use Illuminate\Database\Events\StatementPrepared;
在boot方法中添加:
Event::listen(StatementPrepared::class, function ($event) {
$event->statement->setFetchMode(\PDO::FETCH_ASSOC);
});
$dbh=DB::getPdo();
$sth = $dbh->prepare("SHOW STATUS
WHERE Variable_name = 'Max_used_connections'
OR Variable_name = 'Max_used_connections_time'
OR Variable_name = 'Threads_connected' ");
$sth->execute();
$result = $sth->fetch(PDO::FETCH_CLASS);
print_r($result);
试试这个。为我工作。您只需要 DB 特征(使用 DB;)。
我发现还有另一种选择可以绕过它 添加环境
DB_FETCHMODE=FETCH_ASSOC
在配置/数据库中添加connections.mysql
'fetch_mode' => env('DB_FETCHMODE', 'FETCH_ASSOC'),
在照亮/database/connection.php中将准备好的函数替换为
protected function prepared (PDOStatement $statement){
$config = $this->config;
$statement->setFetchMode($config['fetch_mode'] == "FETCH_OBJ" ? 5 : ($config['fetch_mode'] == "FETCH_NUM" ? 3 : 2));
$this->event(new Events\StatementPrepared(
$this, $statement ));
return $statement;
}
这将为您的应用程序设置默认
FETCH_ASSOC
然后如果你想像以前一样改变它, 添加
config(['database.connections.mysql.fetch_mode' => 'FETCH_OBJ']);
替代
DB::setFetchMode(PDO::FETCH_ASSOC);
在 Laravel < 5.4
在 config/database.php 中添加默认获取模式
return [
'fetch' => PDO::FETCH_CLASS,
...
];
我放弃了重新更改获取模式,并编写了一个辅助函数来将集合转换回数组数组:
/**
* Converts any iterable to an array-of-arrays. Intended for use with Laravel's {@link \Illuminate\Support\Collection} type.
* Provided for backwards-compatibility because FETCH_ASSOC is no longer available.
* Avoid using this in new code to prevent overhead of conversion.
*
* @return array[][]
*/
public function collection2array(iterable $collection): array {
$out = [];
foreach($collection as $el) {
$out[] = (array)$el;
}
return $out;
}
我不建议到处使用它,因为它可能会降低性能,但为了克服我遇到的一些错误,这是最简单的。