无论定义什么数据类型,PHP sqlite 都会返回所有字符串

van*_*ane 5 php sqlite pdo

我正在使用内存数据库中的 sqlite 运行单元测试,但遇到了一个问题。

当我使用 mysql 数据库执行测试时,以下比较正常工作

if ($item->user_id === Auth::id())
Run Code Online (Sandbox Code Playgroud)

如果数字匹配,它将评估为真,如果不匹配,它将评估为假。当我在内存数据库中使用 sqlite 时,条件语句将始终返回,false因为该user_id属性作为 astring而不是正确的int数据类型返回。

我读过一些帖子和评论,说这是 PHP 中 sqlite 的可配置内容,而其他人则说它无法更改。我想在我的测试中使用内存中的 sqlite 数据库,但如果我不能改变这种行为,我必须改变我的条件来使用,==而不是更严格的===. 如何更改 sqlite 查询的行为?

更新

我也试过将它添加到 sqlite 配置中

'sqlite' => [
    'driver' => 'sqlite',
    'database' => env('DB_DATABASE', database_path('database.sqlite')),
    'prefix' => '',
    'options'   => [
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::FETCH_NUM => true,
    ],
],
Run Code Online (Sandbox Code Playgroud)

这也无济于事。

Don*_*nic 6

问题实际上出在 PDO 上,而不是 SQLite 或 Laravel 上,实际上所有数据库都会发生。你得到的事实int从MySQL小号建议您使用mysqlnd驱动程序,解决了这个为MySQL。

我采用的解决方案是在我的模型中显式转换字段

protected $casts = [
    'user_id' => 'integer'
];
Run Code Online (Sandbox Code Playgroud)

  • 虽然我同意这是一个解决方案,并且可能最终成为需要的解决方案,但我宁愿不必将它添加到我拥有的每个 int 列的每个模型中。有没有办法将 PDO 配置为不执行此操作,或者可能是本机 sqlite 驱动程序而不是 PDO 驱动程序?默认情况下,laravel 不是配置为使用 PDO MySql 驱动程序吗? (2认同)