2015-07-22 17 views
7

Vorrei restituire INT come numeri interi dal mio database. Al momento tutti i valori sono caricati come stringhe. Il database è MSSQL 2012 e io uso il driver PDO (per v5.6).Impostazioni PDO Laravel?

Cercando di impostare le proprietà qui (come mostrato here on fideloper.com, ma non so se è ancora possibile):

'sqlsrv' => [ 
     'driver' => 'sqlsrv', 
     'charset' => 'utf8', 
     'prefix' => '', 
     ...... 
     'options' => array(
      PDO::ATTR_STRINGIFY_FETCHES => false, 
      PDO::ATTR_EMULATE_PREPARES => false, 
     ), 
    ], 

Ma ottenere sempre un errore:

SQLSTATE[IMSSP]: The given attribute is only supported on the PDOStatement object. 

Come posso imposta le impostazioni per il driver PDO per restituire INT come numeri interi e non come stringhe.

Questo non funziona ancora:

$pdo = DB::connection()->getPdo(); 
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
.. do ORM Query 

Portando lo stesso errore.

Forse qualcuno può aiutarmi?

+0

Funziona quando non si impostano gli attributi? Si può prendere in considerazione l'apertura di un problema sul repository git –

+0

Tutto funziona correttamente, ammetto solo ottenere TUTTI i valori numerici come stringhe indietro da laravel ORM.Lo userò come servizio Web RESTful e il suo stupido per convertire ogni valore da I/O al tipo di dati corretto;), quindi sarebbe bello se potessi ottenere i valori come numerici. – derdida

+0

Un'altra cosa da considerare è il passaggio di 'EMULATE_PREPARES'. –

risposta

3

Credo che questo problema sia correlato al driver PDO utilizzato (installato con PHP, non con la configurazione di laravel).

Non proprio quello che stai cercando, ma potrebbe potenzialmente risolvere i tuoi problemi. Poiché laravel 5 è stato una funzione di cast su eloquente in cui le colonne vengono automaticamente trasmesse ai tipi predefiniti. Vedere http://laravel.com/docs/5.0/eloquent#attribute-casting

// Eloquent Model 
protected $casts = [ 
    'int_column' => 'int', 
]; 

tuo int_column sarebbe poi automaticamente essere gettato in un int quando il modello viene recuperato dal database

+0

Grazie - se il cast viene eseguito manualmente, funziona correttamente, ma a volte è necessario unirsi da tabelle diverse, quindi non riesco a trasmettere ogni valore (o?) - perché non è memorizzato nel mio modello. Controllerò anche la configurazione PDO predefinita, ma questa è sicuramente una buona soluzione. – derdida

+0

Abbiamo riscontrato anche questo problema, sembra che il driver MSSQL PDO restituisca tutti i dati come stringhe. Stiamo utilizzando ZF e aggiungiamo una classe di istruzioni personalizzata utilizzando PDOStatement :: getColumnMeta per trasmettere automaticamente i dati al tipo corretto. Forse Lavalel ha funzionalità simili. – bstoney

7

So che questo è un vecchio thread, ma ho trovato una soluzione globale a questo problema per MSSQL driver e PHP 7 (cambio singolo che interessa tutte le tabelle/modelli). Speriamo che questo aiuti gli altri che stanno lottando con lo stesso.

  1. Scarica l'ultima versione dei driver dal repository Git (Microsoft/msphpsql). La versione corrente rilasciata nella pagina Download di Microsoft è una versione precedente e non funzionerà (al 13/09/2016).
  2. Copia le DLL appropriate nella cartella php/ext (sostituendo/eliminando la versione precedente). Probabilmente dovrai fermare/avviare il tuo server web (sicuramente, se IIS) per liberare i file originali per la sostituzione/eliminazione. Se i nomi dei file sono stati modificati rispetto alla versione precedente installata, aggiornare il file php.ini.
  3. Aggiornare la configurazione del driver per includere la nuova PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE parametri:

    'sqlsrv' => [ 
        'driver' => 'sqlsrv', 
        'host' => env('DB_HOST', 'localhost'), 
        'database' => env('DB_DATABASE', 'database'), 
        'username' => env('DB_USERNAME', 'laravel'), 
        'password' => env('DB_PASSWORD', 'password#1'), 
        'charset' => 'utf8', 
        'prefix' => '', 
        'options' => array(
         PDO::ATTR_STRINGIFY_FETCHES => false, 
         PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE => true 
        ), 
    ], 
    

Per la spiegazione della soluzione, l'ho trovato, lavorando il mio modo attraverso il codice sorgente sul Git repository. Naturalmente sarebbe stato molto più semplice se avessi letto prima la sezione Annunci del file README:

July 28, 2016 (4.1.0): Thanks to the community's input, this release expands drivers functionalities and also includes some bug fixes:

  • SQLSRV_ATTR_FETCHES_NUMERIC_TYPE connection attribute flag is added to PDO_SQLSRV driver to handle numeric fetches from columns with numeric Sql types (only bit, integer, smallint, tinyint, float and real). This flag can be turned on by setting its value in PDO::setAttribute to true , For example, $conn->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE,true); If SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is set to true the results from an integer column will be represented as an int , likewise, Sql types float and real will be represented as float . Note for exceptions:
    • When connection option flag ATTR_STRINGIFY_FETCHES is on, even when SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is on, the return value will still be string.
    • When the returned PDO type in bind column is PDO_PARAM_INT , the return value from a integer column will be int even if SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is off.