Ошибка при использовании оператора «ВСЕ» при выполнении запроса - PullRequest
0 голосов
/ 28 сентября 2018

Мне нужно выполнить следующий запрос с использованием платформы phalcon: «SELECT id FROM таблицы GROUP BY id HAVING '31' = ALL (array_agg (status))" Как я могу выполнить этот запрос с помощью phalcon?Когда я делаю следующее:

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

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

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

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

0 голосов
/ 28 сентября 2018

Я не уверен на 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
])
...