После некоторых исследований API Propel ModelCriteria не поддерживает произвольные объединения, как описано в группе пользователей Propel здесь . ModelCriteria работает только тогда, когда схема определяет отношения, и, поскольку таблица в приведенном выше примере не ссылается сама на себя, это невозможно сделать без использования старых критериев.
Propel 1.6, однако, поддерживает несколько условий для объединения, как описано в документации , если это полезно для кого-либо. Вы должны убедиться, что у вас есть Propel 1.6 , однако.
Вместо этого мне пришлось вернуться к подзапросу, который Propel 1.6 теперь также поддерживает с addSelectQuery
. Я изменил SQL, чтобы он выглядел так:
SELECT * FROM (
SELECT * FROM machine_location
ORDER BY time DESC
) AS times GROUP BY times.machine_id;
Это можно написать с помощью Propel:
$times = MachineLocationQuery::create()
->orderByTime('desc');
$latestLocations = MachineLocationQuery::create()
->addSelectQuery($times, 'times')
->groupBy('MachineId')
->find();
Будьте внимательны при чтении документации; это addSelectQuery()
, а не useSelectQuery()
.
Чтобы разместить и использовать в вызове Query и разрешить объединения, мне пришлось преобразовать элементы в массив, содержащий их первичные ключи, и вернуть поиск этих первичных ключей. Пропел, казалось, задохнулся, если я вернул вышеупомянутый объект запроса, без поиска.
return $this
->filterByPrimaryKeys($latestLocations->toKeyValue('MachineId', 'Id'));