首页 > 解决方案 > 如何在两张表中使用 laravel WhereIn?

问题描述

我有两张桌子(cardscomposed_card)。

第一个表是cards表,其中包含多个 ID 为 (1, 2, 3, 4, 5, 6, ....) 的卡片。

第二个表是card_compositions,其中包含三列 (composed_cardused_card)。

在第二个表中,composed_cardused_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 代码中可能做错了什么?

标签: phpmysqllaravel

解决方案


你必须使用一个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
});

如果你转储它,你会得到你期望的原始查询,运行它会得到结果。


推荐阅读