我想使用原始查询雄辩地编写此查询:
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]]);
答案 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) . '?';
要处理阵列中零项的实例,我想出了以下函数:
function in($arr)
{
return count($arr) > 0 ? str_repeat('?,', count($arr) - 1) . '?' : false;
}
实时示例