У меня есть массив ids [1,1,2,1,1,1], когда я использую where In Не повторяйте данные, я получаю только данные [1,2], как заставить его получать [1,1,2,1,1,1] в том же порядке?
$selected_tasknotes_persons_made_comment = tasksNote::where("noted_task", request()->task_id )->get()->pluck('user_id');
// $ selected_tasknotes_persons_made_comment = [1,1,2,1,1,1]
$persons_gave_notes = User::whereIn('id', $selected_tasknotes_persons_made_comment )->get();






В SQL ваш запрос может выглядеть так:
select id
from sometable
where id IN(1,1,2,1,1,1)
IN(1,1,2,1,1,1) означает в SQL следующее:
select id
from sometable
where (id = 1 or id = 1 or id = 2 or id = 1 or id = 1 or id = 1)
Если в таблице есть только одна строка с id = 1, вы получите только эту одну строку. Он НЕ умножается на количество раз, которое вы фильтруете для этой строки.
Также обратите внимание, что обычно (по соглашению) столбец id является УНИКАЛЬНЫМ в таблице, поэтому, вероятно, есть только одна строка, где id = 1, и одна строка, где id = 2.
Кроме того, в таблицах SQL есть «неупорядоченные наборы», просто нет никакой гарантии, что вы получите набор результатов в каком-либо конкретном или предсказуемом порядке, ДО тех пор, пока вы не примените предложение order by.
Короче говоря, вы ожидаете чего-то, чего SQL просто не делает.
Вы можете вставить значения своего массива в таблицу (или «производную таблицу») с одним значением на строку в этой таблице (т.е. 6 строк в вашем примере), ЗАТЕМ присоедините это к исходным данным, и ЗАТЕМ вы получите больше строк. например
select tablex.id
from tablex
inner join (
select 1 as n, 0 as sortby union all
select 1 as n, 1 as sortby union all
select 2 as n, 2 as sortby union all
select 1 as n, 3 as sortby union all
select 1 as n, 4 as sortby union all
select 1 as n, 5 as sortby
) myarray on tablex.id = myarray.n
order by
myarray.sortby
Согласно вашему запросу User::whereIn('id', $selected_tasknotes_persons_made_comment )->get(), это означает, что он возвращает результаты уникальности, если вы хотите получить повторяющиеся записи, следуйте инструкциям ниже:
вы можете выполнить необработанный запрос в laravel, чтобы получить повторяющиеся значения, в которых используется UNION ALL
$sql_query= 'SELECT u.*
FROM User u
JOIN ( SELECT 1 AS id UNION ALL SELECT 1 AS id
UNION ALL SELECT 2 AS id
UNION ALL SELECT 1 AS id
UNION ALL SELECT 1 AS id
UNION ALL SELECT 1 AS id
) i ON i.id= u.id';
Итак, вы можете выполнить необработанный запрос следующим образом
$results = DB::select($sql_query);
Другой способ (используя красноречивый метод): я немного запутался в приведенном ниже запросе, но вы можете попробовать этот способ, используя havingRaw
User::whereIn('id', $selected_tasknotes_persons_made_comment )
->havingRaw('count(*) > 1'); })->get()