首页 > 解决方案 > 不能在 DB::select 的 Laravel 中为 IN 条件使用参数

问题描述

出于某种奇怪的原因,在我的查询中,这些参数不适用于 In 条件。

如果我对参数进行硬编码,则查询将返回结果:

DB::select("SELECT * FROM my_table WHERE vendor_id IN (19009, 19010)

这些不返回结果:

DB::select("SELECT * FROM my_table WHERE vendor_id IN (':vendor_ids')", [
  ':vendor_ids' => implode([
    19010,
    19009,
  ]),
]);

DB::select("SELECT * FROM my_table WHERE vendor_id IN (':vendor_ids')", [
  ':vendor_ids' => [
    19010,
    19009,
  ],
]);

DB::select("SELECT * FROM my_table WHERE vendor_id IN (':vendor_ids')", [
  ':vendor_ids' => '19009, 19010',
]);

标签: laravellaravel-query-builder

解决方案


使用IN(:paramters)只会返回一行。

您需要单独绑定参数,例如IN(:parameter1, parameter2). 因此,如果您执行以下操作,您应该会得到预期的结果

DB::select("SELECT * FROM my_table WHERE vendor_id IN (':vendor_id1, :vendor_id2',...)", 
    [':vendor_id1' => 1, ':vendor_id2' => 2]);

更多细节

要动态生成参数,如果您有一组供应商 ID 遍历它们并创建另一个关联数组

$vendors = [];
foreach ($vendorId as $id) {
    $vendors[':vendor' . $id] = $id;
}

然后

DB::select("SELECT * FROM my_table WHERE vendor_id IN (" . implode(array_keys($vendors), ',') . ")", 
    $vendors);

推荐阅读