问题
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) 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?
Here's an example of my code:
<?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;
}
}
Thank you!
回答1:
Go to: app/Providers/EventServiceProvider.php
Add this to the top of the file:
use Illuminate\Database\Events\StatementPrepared;
In the boot method add:
Event::listen(StatementPrepared::class, function ($event) {
$event->statement->setFetchMode(\PDO::FETCH_ASSOC);
});
回答2:
Add default fetch mode in config/database.php
return [
'fetch' => PDO::FETCH_CLASS,
...
];
回答3:
$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);
Try this. worked for me. You require only DB trait(use DB;).
回答4:
Theres another option I find to by pass it
Add env DB_FETCHMODE=FETCH_ASSOC
In config/database add for connections.mysql
'fetch_mode' => env('DB_FETCHMODE', 'FETCH_ASSOC'),
In illuminate/datbase/connection.php replace prepared function withprotected 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;
}
This make default FETCH_ASSOC for your application
Then if you want to change it like before,
addconfig(['database.connections.mysql.fetch_mode' => 'FETCH_OBJ']);
a replacement of DB::setFetchMode(PDO::FETCH_ASSOC);
来源:https://stackoverflow.com/questions/44795215/laravel-5-4-how-to-set-pdo-fetch-mode