问题描述
自定义获取模式的功能已从 L5.4 中删除,默认为 PDO::FETCH_OBJ.
The ability to customize the fetch mode was removed from L5.4 and is defaulted to PDO::FETCH_OBJ.
升级指南指出您可以使用事件侦听器覆盖它:
The upgrade guide states that you can override this by using an event listener:
Event::listen(StatementPrepared::class, function ($event) { $event->statement->setFetchMode(...); });
我一生都无法理解如何实现这一点:
I can't for the life of me understand how to implement this:
1) 我应该把代码放在哪里?我应该使用 EventServiceProvider 注册它吗?
2) StatementPrepared 事件何时触发?(我只需要为特定的存储库功能更改 Fetch Mode,而不是在全局范围内).
3) FetchMode 是否会为后续查询自动恢复?
1) Where should I place the code? Should I register it with the EventServiceProvider?
2) When does the StatementPrepared event fire? (I only need to change the Fetch Mode for specific repository functions, not on a global scale).
3) Does the FetchMode revert itself automatically for subsequent queries?
这是我的代码示例:
<?php namespace AppRepositoriesBackend; 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 IlluminateDatabaseEventsStatementPrepared;
在 boot 方法中添加:
Event::listen(StatementPrepared::class, function ($event) { $event->statement->setFetchMode(PDO::FETCH_ASSOC); });