【问题标题】:How to to use laravel WhereIn with two tables?如何在两张表中使用 laravel WhereIn?
【发布时间】:2021-05-09 09:41:26
【问题描述】:

我有两张桌子(cardscomposed_card)。

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

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

在第二个表中,composed_cardused_card 都是 cards 表的外键。

我正在尝试在 Laravel 中编写一个查询,以获取在 card_compositions 表中至少有一个 composed_card 的所有 cards

我正在尝试在 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 代码中做错了什么?

【问题讨论】:

  • 您是否缺少get?即whereIn(....)->get() ?
  • 你遇到了什么错误
  • 为什么不用join语句?

标签: php mysql laravel


【解决方案1】:

您必须使用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
});

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2021-02-13
    • 1970-01-01
    • 2019-04-12
    • 2021-02-10
    相关资源
    最近更新 更多