Как правильно построить запрос, вида:
Код: Выделить всё
SELECT sub.*, joined1.field1, joined2.field1
FROM (
SELECT * FROM main WHERE ...
) AS sub
WHERE
LEFT JOIN joined1
LEFT JOIN joined2
...
Код: Выделить всё
$query = (new Query())
->from(['sub' => $rootQuery])
Если сделать так, то получаем
SQLSTATE[42601]: Syntax error: 7 ОШИБКА: ошибка синтаксиса (примерное положение: "SELECT"), т.к. билдер не догадывается обернуть подзапрос в скобки.
Код: Выделить всё
$query = (new Query())
->from(['sub' => new Expression("({$rootQuery->sql})", $rootQuery->params)])
->addParams($rootQuery->params)
Если сделать так, то получаем
SQLSTATE[08P01]: <<Unknown error>>: 7 ОШИБКА: в сообщении Bind передано неверное число параметров (0, а подготовленный оператор "pdo_stmt_00000001" требует 1), не работает, потому-что параметры не выбираются из условия и не передаются в верхний запрос (
https://github.com/yiisoft/yii2/blob/ma ... y.php#L548), но и выглядит очень костыльно.
Если передать параметрs запроса вот так, вторым аргументом
Код: Выделить всё
$rootQuery->andWhere(['client.status' => $filter->status], [':qp1' => $filter->status]);
то запрос отрабатывает, но как мне узнать или присвоить в таком случае имя параметра? Впрочем, всё равно это получается как-то криво, по всей видимости я не туда копаю?