【发布时间】:2020-10-14 15:20:28
【问题描述】:
我想通过存储在 JSON 字段中的外键连接 2 个表。该字段可以为空,所以我得到一个错误,我无法摆脱。
我有一个模特Transaction:
class Transaction extends BaseModel
{
protected $casts = [
'items' => 'json',
];
items 字段是 json:
[{"event_id":25,"article_nr":"000123","title":"My Event"}]
现在我想加入这些表进行查询:
Transaction::join('events','transactions.items->event_id', '=', 'events.id')
->get();
问题是,我有很多交易类型,所以 items 字段不一定包含event_id 键,甚至可以为空。
Eloquent 的 SQL 查询是:
select * from `transactions` inner join `events` on json_unquote(json_extract(`transactions`.`items`, '$."event_id"')) = `events`.`id`
所以对于空items-field 的行我得到错误:
3141 Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
有没有办法改变我的联接并只选择包含items->event_id 键的行?
[编辑] 添加了 SQL 原始查询
【问题讨论】:
-
甚至可以是空的 在这种情况下,精确值是多少。
-
一个空字符串
-
替换为有效的 JSON。例如,一个空数组。
-
很好,现在看起来好多了。我没有收到任何错误。结果仍然是空的,但我想我可以克服这个。我猜我的语法是错误的。非常感谢。
-
好吧,下一个问题:如果您查看数据中的括号,我的项目对象是一个数组。 eloquent 将其翻译为
inner join events on json_unquote(json_extract(transactions.items, '$."[0]event_id"')) = events.id,但我需要inner join events on json_unquote(json_extract(transactions.items, '$[0]."event_id"')) = events.id