2015-07-22 2 views
7

Я хотел бы вернуть INT как целые числа из моей базы данных. На данный момент все значения загружаются как строки. База данных - MSSQL 2012, и я использую драйвер PDO (для v5.6).Настройки Laravel PDO?

Попытка установить здесь свойства (как показано here on fideloper.com, но я не знаю, если это еще возможно):

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

Но всегда получаю сообщение об ошибке:

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

Как я могу установите любые настройки для драйвера PDO, чтобы вернуть INT как целые, а не как строки.

Это еще не работает:

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

Доведение ту же ошибку.

Может быть, кто-нибудь может мне помочь?

+0

Работает ли оно, когда вы не устанавливаете атрибуты? Вы можете рассмотреть вопрос об открытии проблемы в git repo. –

+0

Все работает нормально, больной получает только ВСЕ числовые значения в виде строк от larvel ORM.Я использую это как RESTful Webservice, и его глупо, чтобы преобразовать каждое значение из IOS в правильный тип данных;) - так что было бы здорово, если бы я мог получать значения как числовые. – derdida

+0

Еще одна вещь, которую стоит рассмотреть - это поворот 'EMULATE_PREPARES'. –

ответ

3

Я считаю, что эта проблема связана с используемым драйвером PDO (который установлен с PHP, а не с конфигурацией laravel).

Не совсем то, что вы ищете, но потенциально может решить ваши проблемы. Поскольку laravel 5 theres была отличной особенностью на красноречиве, где ваши столбцы автоматически отбрасываются на ваши заранее определенные типы. См http://laravel.com/docs/5.0/eloquent#attribute-casting

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

Ваш int_column затем автоматически приводится к междунар когда модель извлекается из базы данных

+0

Спасибо - если плохо отбросить его вручную, он отлично работает, но иногда ему необходимо присоединиться к различным таблицам, поэтому я не могу использовать каждое значение (или?) - потому что оно не хранится в моей модели. Я также проверю конфигурацию PDO по умолчанию - но это, безусловно, хороший обходной путь. – derdida

+0

Мы также обнаружили эту проблему, кажется, что драйвер MSSQL PDO возвращает все данные в виде строк. Мы используем ZF и добавляем собственный класс операторов, используя PDOStatement :: getColumnMeta, чтобы автоматически вводить данные в правильный тип. Возможно, Lavalel имеет аналогичную функциональность. – bstoney

7

Я знаю, что это старый нить, но я нашел глобальное решение этой проблемы для MSSQL драйверов и PHP 7 (одно изменение, которое влияет на все таблицы/модели). Надеюсь, это поможет другим, которые борются с этим.

  1. Получить последнюю версию драйверов из репозитория Git (Microsoft/msphpsql). Текущая версия, выпущенная на странице загрузки Microsoft, является более старой версией и не будет работать (по состоянию на 9/13/2016).
  2. Скопируйте соответствующие библиотеки DLL в вашу папку php/ext (заменив/удалив старшую версию). Вероятно, вам необходимо остановить/запустить веб-сервер (определенно, если IIS), чтобы освободить исходные файлы для замены/удаления. Если имена файлов были изменены из предыдущей версии, установленной вами, обновите файл php.ini.
  3. Обновление конфигурации драйвера, чтобы включить новый PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE параметр:

    '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 
        ), 
    ], 
    

Для объяснения решения, я нашел его, работая мой путь через исходный код на Git Repository. Конечно, было бы намного проще, если бы я сначала прочитал раздел «Объявления» файла 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.
Смежные вопросы