我正在使用内存数据库中的 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)
这也无济于事。
问题实际上出在 PDO 上,而不是 SQLite 或 Laravel 上,实际上所有数据库都会发生。你得到的事实int从MySQL小号建议您使用的mysqlnd驱动程序,解决了这个为MySQL。
我采用的解决方案是在我的模型中显式转换字段:
protected $casts = [
'user_id' => 'integer'
];
Run Code Online (Sandbox Code Playgroud)