【问题标题】:Laravel 5.4 - How to set PDO Fetch Mode?Laravel 5.4 - 如何设置 PDO 获取模式?
【发布时间】:2017-12-01 09:20:04
【问题描述】:

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

升级指南声明您可以使用事件监听器覆盖它:

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

我一生都无法理解如何实现这一点:

1) 我应该把代码放在哪里?我应该用EventServiceProvider注册它吗?
2) StatementPrepared 事件何时触发? (我只需要为特定的存储库功能更改 Fetch Mode,而不是在全局范围内)。
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;
    }
}

谢谢!

【问题讨论】:

标签: php pdo eloquent laravel-5.4 internals


【解决方案1】:

转到:app/Providers/EventServiceProvider.php

将此添加到文件顶部:

use Illuminate\Database\Events\StatementPrepared;

boot方法中添加:

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

【讨论】:

  • 啊,我刚刚意识到你不想在全球范围内使用它。这样就可以了。
【解决方案2】:
$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;)。

【讨论】:

  • 或者干脆DB::connection()-&gt;getPdo()-&gt;query($sql)-&gt;fetchAll(\PDO::FETCH_ASSOC);
  • @wp78de - 一个班轮是完美的。谢谢。
【解决方案3】:

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

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

【讨论】:

  • 根据文档,这适用于低于 5.4 的 Laravel 版本。任何等于或高于5.4的都需要使用Scott的推荐laravel.com/docs/5.4/upgrade
【解决方案4】:

我发现还有另一个选项可以绕过它 添加环境

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

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 2015-02-01
    • 2017-12-05
    • 1970-01-01
    • 2011-04-23
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多