2015-06-27 7 views
6

Stiamo usando Symfony per creare alcuni webservices. Utilizziamo Doctrine-ORM per archiviare entità e Doctrine-DBAL per recuperare dati poiché è molto leggero e può riutilizzare la connessione ORM (gestore entità).dottrina non persistono entità con valori booleani e DOP :: ATTR_EMULATE_PREPARES = falsi in Mysql

Quando si utilizza Doctrine-DBAL, i valori interi vengono restituiti a PHP come stringhe e si desidera avere valori interi, specialmente perché vengono ritentati in Javascript. A seguito di questa discussione How to get numeric types from MySQL using PDO? abbiamo installato mysql driver nativo sudo apt-get install php5-mysqlnd e la configurazione del nostro symfony (dbal) configurazione con PDO :: ATTR_EMULATE_PREPARE = ​​false:

doctrine: 
    dbal: 
     . 
     . 

     options: 
      20 : false # PDO::ATTR_EMULATE_PREPARES is 20 

Con questa configurazione stiamo ottenendo interi quando i campi di MySQL sono interi. Fin qui tutto bene.

Ma c'è un nuovo problema: Quando si memorizzano le entità con valori booleani attraverso Doctrine-ORM l'entità non viene mantenuto. Vediamo nei registri l'inserto e il commit, ma il record non è nel database (se usiamo una tabella senza campi booleani definiti nell'entità, il record viene memorizzato).

Inoltre, non otteniamo alcun errore o eccezione, così troviamo questo molto pericoloso. Pensiamo che ci sia un bug nella libreria PDO, ma dobbiamo guardare un po 'di più in esso.

La domanda: Qualcuno ha sperimentato questo comportamento? qualche soluzione? Doctrine dovrebbe tener conto di questo?

+0

nel mio caso, c'era un Preparare inviato, ma non di esecuzione, così nella mia caso ho visto qualcosa nei log. Trovato questo, grazie! – Dennis

risposta

3

Se non è troppo tardi per voi, è possibile risolvere questo problema nella vostra applicazione bootstrap in questo modo:

\Doctrine\DBAL\Types\Type::overrideType('boolean', 'Doctrine\\DBAL\\Types\\IntegerType'); 

Dopo questa linea viene eseguita Dottrina DBAL mapperà il tuo PHP valori booleani ai prodotti DOP interi (DOP: : PARAM_INT invece od PDO: PARAM_BOOL).

+2

+1 Tuttavia questo avrà l'effetto di idratare le entità con numeri interi invece di valori booleani. Vedi la mia risposta per aggirare questo. – webbiedave

4

di gseric answer funzionerà, ma con l'effetto di idratazione tuoi soggetti con i numeri interi. Per ancora ottenere booleani nelle entità si può semplicemente estendere di BooleanType Dottrina:

class BooleanToIntType extends \Doctrine\DBAL\Types\BooleanType 
{ 
    public function getBindingType() 
    { 
     return \PDO::PARAM_INT; 
    } 
} 

Poi, nella vostra applicazione di bootstrap:

\Doctrine\DBAL\Types\Type::overrideType('boolean', BooleanToIntType::class); 
+0

Grande, grazie! – gseric