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

时间:2017-06-28 06:35:35

标签: php pdo eloquent laravel-5.4 internals

自定义提取模式的功能已从L5.4中删除,默认为PDO :: FETCH_OBJ。

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

Event::listen(StatementPrepared::class, function ($event) {
    $event->statement->setFetchMode(...);
});

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

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;
    }
}

谢谢!

4 个答案:

答案 0 :(得分:5)

转到: app / Providers / EventServiceProvider.php

将其添加到文件顶部:

use Illuminate\Database\Events\StatementPrepared;

boot 方法中添加:

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

答案 1 :(得分:1)

在config / database.php中添加默认提取模式

return [
    'fetch' => PDO::FETCH_CLASS,
    ...
];

答案 2 :(得分:0)

$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 trait(使用DB;)。

答案 3 :(得分:0)

我发现还有另一种选择 添加环境DB_FETCHMODE=FETCH_ASSOC
在配置/数据库中添加connections.mysql   'fetch_mode' => env('DB_FETCHMODE', 'FETCH_ASSOC'),
在illuminate / datbase / 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);