2015-05-22 2 views
2

я иметь следующую структуру таблицы с соответствующими отношениями:Наличие (количество) в запросе CakePHP 3 не работает на PostgreSQL

,---------. ,--------------. ,---------. 
    | Threads | | ThreadsUsers | | Users | 
    |---------| |--------------| |---------| 
    | id | |  id  | | id | 
    '---------' | thread_id | '---------' 
       | user_id | 
       '--------------' 

Этот обычай запрос в ThreadsTable предназначается, чтобы найти темы с заданным числом участников. Он отлично работает на MySQL

public function findWithUserCount(Query $query, array $options) 
{ 
    return $query 
     ->matching('Users') 
     ->select([ 
      'Threads.id', 
      'count' => 'COUNT(Users.id)' 
     ]) 
     ->group('Threads.id HAVING count = ' . $options['count']); 
} 

Однако он не на PostgreSQL со следующей ошибкой

PDOException: SQLSTATE[42703]: Undefined column: 7 
     ERROR: column "count" does not exist 
LINE 1: ...ThreadsUsers.user_id)) GROUP BY Threads.id HAVING count = 2 

ответ

2

Оговорка HAVING не может ссылаться на псевдонимы столбцов, определенные в пункте SELECT. documentation says:

Каждый столбец ссылается условие должно однозначно ссылаться на столбец группировки, если ссылка не появится в агрегатной функции или разгруппировать столбец функционально зависит от группирования столбцов.

count Поскольку не является ни «группировкой колонны» (то есть субъект пункта GROUP BY), ни статистическая функция, она не может быть использована там.

Так что правильная форма, предположительно, будет (я не знаю, CakePHP, а также тот факт, что вы можете вводить SQL в group вызова вообще кажется массово разбитого дизайн для построитель запросов):

->group('Threads.id HAVING COUNT(Users.id) = ' . $options['count']); 
+0

Спасибо, @IMSoP, это работает для меня, я должен был использовать следующий Snippe функции findWithUserCount общественности (Query $ запроса, массив $ вариантов) { возврата $ запрос -> согласующего ('Users') -> выберите (['Threads.id']) -> group ('Threads.id') -> havi ng ('COUNT (Users.id) ='. $ опции [ 'Количество']); } –

Смежные вопросы