【问题标题】:PHP sqlite is returning all strings no matter what data type is defined无论定义什么数据类型,PHP sqlite 都会返回所有字符串
【发布时间】:2018-03-30 01:33:36
【问题描述】:

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

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

if ($item->user_id === Auth::id())

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

我读过一些帖子和 cmets 说这是 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,
    ],
],

这也无济于事。

【问题讨论】:

    标签: php sqlite pdo


    【解决方案1】:

    The problem is actually with PDO,而不是专门的 SQLite 或 Laravel,事实上所有数据库都会发生这种情况。您从 MySQL 获得 ints 的事实表明您正在使用 the mysqlnd driver,它为 MySQL 解决了这个问题。

    我采用的解决方案是在我的模型中使用explicitly cast fields

    protected $casts = [
        'user_id' => 'integer'
    ];
    

    【讨论】:

    • 虽然我同意这是一个解决方案并且最终可能会成为需要的解决方案,但我宁愿不必将它添加到我拥有的每个 int 列的每个模型中。有没有办法将 PDO 配置为不这样做,或者可能是本地 sqlite 驱动程序而不是 PDO 驱动程序? laravel 不是默认配置为使用 PDO MySql 驱动吗?
    • @vane 没有,没有
    • @vane 这对我来说也不是很理想,但我不知道还有其他选择。这样我就有理由相信无论我使用什么数据库或驱动程序,它都能正常工作。
    • @Don'tPanic 它有效,实际上在您回答之前我已经得出了这个结论,但不想接受它作为解决方案,因为它有一种不好的代码气味。不幸的是,我担心您是正确的,因为这是目前唯一真正的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 2015-09-27
    • 2020-12-06
    • 2021-01-17
    • 2019-12-11
    • 1970-01-01
    • 2020-07-21
    • 2010-11-11
    相关资源
    最近更新 更多