当引用的列不存在时,如何在 PHP/Laravel 中获取 SQLite 错误

问题描述 投票:0回答:1

我之前的问题相关,我发现由于我犯的错误,Laravel 生成了错误的 SQL 查询:

select * from "companies" where "companies"."id" = '9c54986f-8284-4da9-b826-c7a723de279b' and "companies"."deleted_at" is null and "company_id" = '9c54986f-8284-4da9-b826-c7a723de279b'

这里的问题是

company_id
不存在于
companies
中;但是,查询在运行时不会生成错误,它只是不返回结果。

我认为这里的问题是

"company_id"
被视为文字而不是列引用;如果我删除引号,我会得到一个正确的错误:

Error: in prepare, no such column: company_id (1)

如果我将表前缀添加到列名中,我也会收到正确的错误:

sqlite> select * from "companies" where "companies"."id" = '9c54986f-8284-4da9-b826-c7a723de279b' and "companies"."deleted_at" is null and "companies"."compa
ny_id" = '9c54986f-8284-4da9-b826-c7a723de279b';
Error: in prepare, no such column: companies.company_id (1)

有没有办法通过作用于 Laravel 或 SQLite 的配置来解决这个问题?我无法更改查询的生成方式,因为它们是由框架本身生成的。

php laravel sqlite error-handling laravel-11
1个回答
0
投票

我认为这里发生的是

"company_id"
被解释为字符串文字,而不是列。 请记住,SQLite 接受单引号或双引号的字符串文字。 显然,SQLite 解释双引号字符串的启发式是:

  • 首先检查字符串是否可以映射到某个数据库标识符(例如列)
  • 如果失败,则将字符串视为字符串文字

这是您的查询,格式为:

SELECT *
FROM "companies"
WHERE
    "companies"."id" = '9c54986f-8284-4da9-b826-c7a723de279b' AND
    "companies"."deleted_at" IS NULL AND
    "company_id" = '9c54986f-8284-4da9-b826-c7a723de279b';

由于

company_id
列不存在,此查询似乎被解释为:

SELECT *
FROM "companies"
WHERE
    "companies"."id" = '9c54986f-8284-4da9-b826-c7a723de279b' AND
    "companies"."deleted_at" IS NULL AND
    'company_id' = '9c54986f-8284-4da9-b826-c7a723de279b';

当然,

WHERE
子句最后一项中的字符串比较永远不会为真,因此不会返回任何记录。

您的列不需要使用双引号,因此不要使用它们,以避免此类问题。

© www.soinside.com 2019 - 2024. All rights reserved.