php - 如何在两张表中使用 laravel WhereIn?
问题描述
我有两张桌子(cards
和composed_card
)。
第一个表是cards
表,其中包含多个 ID 为 (1, 2, 3, 4, 5, 6, ....) 的卡片。
第二个表是card_compositions
,其中包含三列 (composed_card
和used_card
)。
在第二个表中,composed_card
和used_card
都是表的外键cards
。
我正在尝试在 Laravel 中编写一个查询,以获取表cards
中至少包含一个composed_card
的所有内容card_compositions
。
我正在尝试在 Laravel Eloquent 中创建此查询。
select * from `cards` where `id` in (select `composed_card` from `card_compositions` where `composed_card` = cards.id) and `cards`.`deleted_at` is null
上面的 SQL 查询工作正常并返回所需的结果。
当我尝试在 Laravel 中执行相同的查询时,它没有返回任何结果:
return Card::whereIn('id', function ($query) {
$query->select('composed_card')
->from('card_compositions')
->where('composed_card', '=', 'cards.id');
});
我写了上面的代码来模拟SQL查询,但是上面的代码不起作用。
我在 php 代码中可能做错了什么?
解决方案
你必须使用一个WhereRaw
. 解释和代码:
您的代码当前正在尝试查找字符串“cards.id”的匹配项,而不是加入表cards.id。如果你这样做
DB::enableQueryLog(); // Enable query log
\\Run your query with ->get()
dd(DB::getQueryLog());
然后你会看到:
array:1 [
0 => array:3 [
"query" => "select * from `cards` where `id` in (select `composed_card` from `card_compositions` where `composed_card` = ?)"
"bindings" => array:1 [
0 => "cards.id"
]
"time" => 4.48
]
]
请注意,您的查询现在有一个绑定,您的原始查询不带任何参数。您的 id 列是整数,它试图在其中找到字符串“cards.id”,但它永远不会,这解释了为什么您没有得到任何结果。所以替换为:
return Card::whereIn('id', function ($query) {
$query->select('composed_card')
->from('card_compositions')
->whereRaw('composed_card = cards.id'); \\new WhereRaw clause
});
如果你转储它,你会得到你期望的原始查询,运行它会得到结果。
推荐阅读
- reactjs - 使用 Semantic UI React 保留标签的形状
- sql - Ruby on Rails 数据库表操作
- javascript - 从表单 HTML/JS 捕获用户输入
- c++ - 尽管写入组合,但 PCI 总线读取性能低
- python - Python 和雪花无法将转换为 JSON 的数据帧插入到雪花上的变体字段中
- prolog - Prolog - 无法按预期运行程序
- laravel - 404 Not Found nginx /1.18.0 aws laravel 项目
- python - 如何使用 CSS 和 Bootstrap 扩展文本宽度
- android - 填充并发出 StateFlow 列表
- java - 找到矩阵的行列式