Ошибка при использовании оператора ALL при выполнении запроса

Мне нужно выполнить следующий запрос с использованием платформы phalcon: «ВЫБЕРИТЕ id FROM table GROUP BY id HAVING '31' = ALL (array_agg (status))». Как я могу выполнить этот запрос с помощью phalcon? Когда я делаю следующее:

 Model::query()
   ->columns(['id'])
   ->groupBy('id')
   ->having('31 = ALL(array_agg(status))')
   ->execute();

Я получаю это сообщение об ошибке: Синтаксическая ошибка, неожиданный токен ВСЕ, рядом с '(array_agg(status)) ', при разборе: SELECT id FROM [SomeNameSpace\Model] GROUP BY [id] HAVING 31 = ALL(array_agg(status)) (137)


person Alex Papilov    schedule 28.09.2018    source источник


Ответы (2)


Я не уверен на 100%, какие функции Postgres поддерживаются, но вы можете попробовать так:

Model::query()
    ->columns([
        'id',
        'ALL(array_agg(status)) AS statusCounter'
    ])
    ->groupBy('id')
    ->having('31 = statusCounter')
    ->execute();

Обратите внимание, что я переместил функции агрегации в предложение select, а не в предложение having.


ОБНОВЛЕНИЕ: вот пример очень индивидуального запроса. Большинство используемых функций не поддерживаются, и иногда проще написать простой SQL-запрос и привязать к нему нужную Модель:

public static function findNearest($params = null)
{
    // A raw SQL statement
    $sql = '
        SELECT *, 111.045 * DEGREES(ACOS(COS(RADIANS(:lat))
         * COS(RADIANS(X(coords)))
         * COS(RADIANS(Y(coords)) - RADIANS(:lng))
         + SIN(RADIANS(:lat))
         * SIN(RADIANS(X(coords)))))
         AS distance_in_km
        FROM object_locations
        ORDER BY distance_in_km ASC
        LIMIT 0,5;    
    ';

    // Base model
    $model = new ObjectLocations();

    // Execute the query
    return new \Phalcon\Mvc\Model\Resultset\Simple(
        null,
        $model,
        $model->getReadConnection()->query($sql, $params)
    );
}

// How to use:
\Models\ObjectLocations::findNearest([
    'lat' => 42.4961756,
    'lng' => 27.471543300000008
])
person Nikolay Mihaylov    schedule 28.09.2018

Вам нужно добавить ВСЕ как расширение диалекта. Проверьте эту тему, например https://forum.phalconphp.com/discussion/16363/where-yearcurrenttimestamp-how-to-do-this

person Juri    schedule 29.09.2018