雄辩的WHERE IN使用原始查询/胶囊管理器

时间:2019-03-07 11:05:43

标签: php sql eloquent

我想使用原始查询雄辩地编写此查询:

INSERT INTO table SELECT * FROM other_table WHERE other_table_id IN (1,2,3)

我尝试过这样写:

use Illuminate\Database\Capsule\Manager as DB;
$insert_db = DB::select("SELECT products_id FROM products WHERE products_id IN (?)", [[265792,265787,265743]])

但是这给了我一个空数组。

使用胶囊管理器编写此代码的正确方法是什么? (我绝对需要使用DB::select来做到这一点)

This question在问同样的事情,早在2013年。当时是不可能的。那今天有变化吗?我们可以在最新版本的口才中使用WHERE IN (?)吗?知道我需要使用?来确保安全性,而不是串联字符串,或者根本不使用PDO是毫无意义的。

编辑:

问题更多是关于动态值。我不能使用:

DB::select("SELECT products_id FROM products WHERE products_id IN (?, ?, ?)", [265792,265787,265743]);

因为数组[265792,265787,265743]正在其他位置构建。因此,请想象以下代码

foreach($test as $k => $v) {
    $arr[] = $v['something']
}

DB::select("SELECT products_id FROM products WHERE products_id IN (?)", [[$arr]]);

2 个答案:

答案 0 :(得分:2)

每个绑定都需要一个占位符:

$placeholders = implode(', ', array_fill(0, count($arr), '?'));
DB::select("SELECT products_id FROM products WHERE products_id IN ($placeholders)", [$arr]);

在Laravel / Eloquent 5.7.17+中,您可以使用insertUsing()

DB::table('table')->insertUsing(['foo', 'bar'], function ($query) use ($arr) {
    $query->from('other_table')
        ->whereIn('other_table_id', $arr);
});

请注意,该方法要求您指定列名(['foo', 'bar'])。

答案 1 :(得分:1)

生成?,占位符的更干净方法是使用str_repeat

$in = str_repeat('?,', count($arr) - 1) . '?';

编辑#1

要处理阵列中零项的实例,我想出了以下函数:

function in($arr)
{
  return count($arr) > 0 ? str_repeat('?,', count($arr) - 1) . '?' : false;
}

实时示例

Repl