Laravel 5.4 - 如何设置PDO获取模式?

Edw*_*ard 7 php pdo internals eloquent laravel-5.4

从L5.4中删除了自定义获取模式的能力,默认为PDO :: FETCH_OBJ.

升级指南指出您可以使用事件侦听器来覆盖它:

Event::listen(StatementPrepared::class, function ($event) {
    $event->statement->setFetchMode(...);
});
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活理解如何实现这个:

1)我应该在哪里放置代码?我应该注册EventServiceProvider吗?
2)StatementPrepared活动什么时候开火?(我只需要更改特定存储库功能的获取模式,而不是全局范围内).
3)FetchMode是否会自动恢复自身以进行后续查询?

这是我的代码示例:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Sco*_*ott 5

转到:app/Providers/EventServiceProvider.php

将其添加到文件顶部:

use Illuminate\Database\Events\StatementPrepared;
Run Code Online (Sandbox Code Playgroud)

boot方法中添加:

Event::listen(StatementPrepared::class, function ($event) {
    $event->statement->setFetchMode(\PDO::FETCH_ASSOC);
});
Run Code Online (Sandbox Code Playgroud)

  • 啊,我刚刚意识到您不希望在全球范围内使用它。这将做到这一点。 (2认同)