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.
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'
];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With