与我之前的问题相关,我发现由于我犯的错误,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 的配置来解决这个问题?我无法更改查询的生成方式,因为它们是由框架本身生成的。
我认为这里发生的是
"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
子句最后一项中的字符串比较永远不会为真,因此不会返回任何记录。
您的列不需要使用双引号,因此不要使用它们,以避免此类问题。