问题
I'm running unit tests using the sqlite in memory database and I've run into an issue.
When I perform the tests using a mysql database, the following comparison works properly
if ($item->user_id === Auth::id())
It will evaluate to true if the numbers match and false if they don't. When I use the sqlite in memory database the conditional statement will always return false
because the user_id
attribute is returned as a string
instead of the proper int
data type.
I've read a few posts and comments saying this is a configurable thing for sqlite in PHP and others saying it cannot be changed. I want to use the in memory sqlite database for my tests but if I can't change this behavior I have to change my conditionals to use ==
instead of the more strict ===
. How can I change the behavior of the sqlite queries?
UPDATE
I've also tried adding this to the sqlite configuration
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'options' => [
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::FETCH_NUM => true,
],
],
This doesn't help either.
回答1:
The problem is actually with PDO, rather than SQLite or Laravel specifically, and in fact happens with all databases. The fact that you are getting int
s from MySQL suggests you are using the mysqlnd driver, which solves this for MySQL.
The solution I went with was to explicitly cast fields in my model:
protected $casts = [
'user_id' => 'integer'
];
来源:https://stackoverflow.com/questions/46805727/php-sqlite-is-returning-all-strings-no-matter-what-data-type-is-defined