2017-06-28 5 views
4

La possibilité de personnaliser le mode de récupération a été retirée de L5.4 et est par défaut à PDO :: FETCH_OBJ.Laravel 5.4 - Comment régler le mode d'extraction PDO?

Le guide de mise à niveau indique que vous pouvez corriger cela en utilisant un écouteur d'événement:

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

Je ne peux pas pour la vie de me comprendre comment implémenter ceci:

1) Où dois-je placer le code? Dois-je l'enregistrer avec le EventServiceProvider?
2) Quand l'événement StatementPrepared se déclenche-t-il? (J'ai seulement besoin de changer le mode Fetch pour des fonctions spécifiques du référentiel, pas à l'échelle globale).
3) Le FetchMode se rétablit-il automatiquement pour les requêtes suivantes?

Voici un exemple de mon 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; 
    } 
} 

Merci!

+0

PS: L'exemple de code fonctionnait parfaitement sur Laravel 5.3 – Edward

+0

Be sont des implications à l'écoute de cette et changer le mode de récupération: https://stackoverflow.com/questions/47637869/database-query-builder-sometimes-returns-array-instead-of-object-running-as-a-qu – patriziotomato

Répondre

3

Aller à: app/fournisseurs/EventServiceProvider.php

Ajouter ce au début du fichier:

use Illuminate\Database\Events\StatementPrepared; 

Dans la méthode boot ajouter:

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

Ah je viens de me rendre compte que vous l'avez fait ne pas le vouloir à l'échelle mondiale. Cela ferait cela. – Brandwagon