Конструктор запросов Laravel `SELECT (x IN (?)) AS y` - PullRequest
0 голосов
/ 08 июня 2018

Как мне сделать этот тип 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 и т. Д. Являются явными методами.

1 Ответ

0 голосов
/ 09 июня 2018

whereIn() внутренне использует Grammar::parameterize() для расширения заполнителей.

Вы также можете использовать его отдельно:

$grammar = new \Illuminate\Database\Query\Grammars\MySqlGrammar();
$query->selectRaw("sector1 IN (" . $grammar->parameterize($filters['sectors'])  . ") AS s1", $filters['sectors']);
...