Как мне сделать этот тип SELECT с помощью построителя запросов Laravel:
SELECT *, (sector1 IN (...)) AS s1, (sector2 IN (...)) AS s2, (sector3 IN (...)) AS s3
FROM jobs
WHERE (sector1 IN (1, 2) OR sector3 IN (1, 2) OR sector3 IN (1, 2))
ORDER BY (s1 AND s2 AND s3) DESC, (s1 AND s2) DESC, (s1 AND s3) DESC, etc...
Часть WHERE
проста с whereIn()
, а часть ORDER
проста с orderByRaw()
,но как мне сделать SELECT
?
Результаты s1
, s2
и s3
теперь могут быть использованы для сортировки: сначала, если все 3 сектора совпадают, чем, если секторы 1 и 2 совпадают, чем в случае совпадения секторов 1 и 3 и т. д.
(...)
- это 1 или более секторов из пользовательского ввода.Они должны быть экранированы, вставлены и т. Д., Как WHERE sector1 IN (...)
.
Но как?
selectRaw
только немного помогает, потому что он не расширяет массив на несколько заполнителей.Это то, что у меня есть сейчас, но этого не может быть:
$query->selectRaw("sector1 IN (" . implode(',', array_fill(0, count($filters['sectors']), '?')) . ") AS s1", $filters['sectors']);
Я должен сам расширять заполнители?Должен быть способ, позволяющий построителю запросов делать это.Может быть ConditionExpression
я не могу найти?Сам конструктор, похоже, не имеет возможности расширить ?
, только Грамматика делает это при выполнении запроса, поэтому whereIn
/ whereNotIn
и т. Д. Являются явными методами.