Laravel PDO设置?

der*_*ida 9 php sql-server laravel

我想从我的数据库返回INT作为整数.目前,所有值都作为字符串加载.数据库是MSSQL 2012,我使用PDO驱动程序(适用于v5.6).

试图在这里设置属性(如fideloper.com上所示,但我不知道是否仍然可以):

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

但总是得到一个错误:

SQLSTATE[IMSSP]: The given attribute is only supported on the PDOStatement object.
Run Code Online (Sandbox Code Playgroud)

如何设置PDO驱动程序的任何设置以将INT作为整数而不是字符串返回.

这仍然无效:

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

带来同样的错误.

也许有人可以帮助我?

Cod*_*iee 15

我知道这是一个旧线程,但我找到了针对MSSQL驱动程序和PHP 7的这个问题的全局解决方案(影响所有表/模型的单一更改).希望这将有助于其他正在努力奋斗的人.

  1. 从Git Repository(Microsoft/msphpsql)获取最新版本的驱动程序.Microsoft下载页面上发布的当前版本是旧版本,无法使用(截至2016年9月13日).
  2. 将相应的DLL复制到您的php/ext文件夹中(替换/删除旧版本).您可能需要停止/启动您的Web服务器(当然,如果是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
        ),
    ],
    
    Run Code Online (Sandbox Code Playgroud)

为了解释这个解决方案,我通过Git Repository上的源代码来找到它.当然,如果我首先阅读README文件的Announcements部分,那将会容易得多:

2016年7月28日(4.1.0):由于社区的意见,此版本扩展了驱动程序的功能,还包括一些错误修复:

  • SQLSRV_ATTR_FETCHES_NUMERIC_TYPE 连接属性标志被添加到PDO_SQLSRV驱动程序,以处理具有数字Sql类型的列的数字提取(只有bit,integer,smallint,tinyint,float和real).该位可以用在设置其值被接通 PDO::setAttributetrue,例如, $conn->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE,true); 如果SQLSRV_ATTR_FETCHES_NUMERIC_TYPE 被设置为true从一个整数列的结果将作为一个表示int,同样地,SQL类型浮动和实际将表示为float.注意例外:
    • 当连接选项标志ATTR_STRINGIFY_FETCHES打开时,即使SQLSRV_ATTR_FETCHES_NUMERIC_TYPE打开,返回值仍将是字符串.
    • 当绑定列中返回的PDO类型为时PDO_PARAM_INT,即使SQLSRV_ATTR_FETCHES_NUMERIC_TYPE关闭,整数列的返回值也将为int .


Wad*_*der 4

我相信这个问题与使用的 PDO 驱动程序有关(随 PHP 安装,而不是 laravel 配置)。

不完全是您正在寻找的内容,但可能会解决您的问题。从 Laravel 5 开始,Eloquent 上有一个强制转换功能,您的列会自动强制转换为预定义的类型。请参阅http://laravel.com/docs/5.0/eloquent#attribute-casting

// Eloquent Model
protected $casts = [
    'int_column'   => 'int',
];
Run Code Online (Sandbox Code Playgroud)

int_column当从数据库检索模型时,您将自动转换为 int