Как ссылаться на столбцы, чтобы заказать объединенный запрос? - PullRequest
0 голосов
/ 23 мая 2019

Я сделал Союз в CakePHP 3, однако Союз делает это так, что сначала показываются записи таблицы покупателей, а затем арендаторов. Принимая во внимание, что я хочу, чтобы это было организовано на основе созданного поля в таблице «Покупатели» и «Арендаторы», поэтому самые последние записи появляются первыми. Я попытался сделать это с помощью эпилога, но выдает ошибку

Ошибка: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «создан» в «предложении заказа»

$tenant = $this->Tenants
    ->find('all', [
        'fields' => ['Tenants.id', 'Tenants.created', 'Consumers.type'],
        'conditions' => ['Tenants.client_id' => '1'],
        'order' => 'Tenants.created desc'
    ])
    ->contain(['Consumers']);

$buyer = $this->Buyers
    ->find('all', [
        'fields' => ['Buyers.id', 'Buyers.created', 'Consumers.type'],
        'conditions' => ['Buyers.client_id' => '1'],
        'order' => 'Buyers.created desc'
    ])
    ->contain(['Consumers']);

$results = $buyer->unionAll($tenant);
$results->epilog('ORDER BY created DESC LIMIT 7 OFFSET 7');

1 Ответ

0 голосов
/ 23 мая 2019

Строитель запросов высокого уровня ORM будет выбирать столбцы, используя псевдонимы, то есть он будет создавать SELECT предложения вроде этого:

SELECT Tenants.id AS Tenants__id, Tenants.created AS Tenants__created, etc...

Таким образом, ваш фрагмент эпилога не увидит столбец created, следовательноОшибка.В таком случае проще всего сослаться на столбец через его номер позиции (хотя, по крайней мере, в MySQL, который устарел в IIRC!):

ORDER BY 2 DESC

В качестве альтернативы выберите столбец created дополнительно с общим псевдонимом., например:

['Tenants.id', 'Tenants.created', 'created' => 'Tenants.created', 'Consumers.type']
['Buyers.id', 'Buyers.created', 'created' => 'Buyers.created', 'Consumers.type']

, который выберет столбец как Tenants.created AS created, и вы можете ссылаться на него в предложении ORDER BY через created.

По крайней мере, в MySQL это такжеКажется, работает для ссылки на один из псевдонимов, если два запроса используют разные псевдонимы для одного и того же столбца (так как объединение выбирает работу на основе позиции), но я не уверен, верно ли это для других СУБД, в любом случае дляради завершения, может работать и следующее:

ORDER BY Tenants__created DESC
...