Быстрое (и грязное) исправление может заключаться в удалении одинарных кавычек в implode()
и использовании FIND_IN_SET()
вместо IN()
:
$users = [435,1671,429];
$list = implode(",", $users);
DB::insert("insert into ".
"rejections (calendar_id, user_id, note, status) ".
"select id as calendar_id, ?, concat(?), concat(?) ".
"from calendar ".
"where DATE(_date) BETWEEN ? AND ? and find_in_set(user_id, ?)"
, [$admin, $note, $status, $start_date, $end_date, $list]);
Обратите внимание, что это может быть медленнее, поскольку индекс для user_id
не может быть использован.
Если вы хотите использовать IN()
в своем запросе, вам потребуется заполнитель для каждого пользователя:
IN (?,?,?)
, а также привязать каждый идентификатор пользователя
[$admin, $note, $status, $start_date, $end_date, $list[0], $list[1], $list[2]]
Поскольку вы, вероятно, заранее не знаете количество пользователей, вы можете использовать что-то вроде этого:
$users = [435,1671,429];
$usersPlaceholders = array_map(function($id) { return '?'; }, $users);
$usersPlaceholders = implode(',', $usersPlaceholders);
$params = array_merge([$admin, $note, $status, $start_date, $end_date], $users);
DB::insert("
insert into rejections (calendar_id, user_id, note, status)
select id as calendar_id, ?, concat(?), concat(?)
from calendar
where DATE(_date) BETWEEN ? AND ? and user_id in ($usersPlaceholders)
", $params);