CakePHP 3, Count/Group Найти результат?

ОБНОВЛЕНИЕ

Я играл с чистым SQL в phpMyAdmin и думаю, что у меня есть ответ, я хотел бы, чтобы кто-нибудь посмотрел на него, чтобы увидеть, есть ли какие-либо проблемы с самим запросом.

Также я не уверен, как лучше поступить, я знаю, что с Doctrine (Symfony) легко выпадающий список для запуска SQL-запроса. Я знаю, что это можно сделать с помощью CakePHP, но не лучше ли построить запрос с помощью построителя запросов?

SQL-запрос:

 SELECT userlevel_id AS userlevelID, COUNT( * ) AS count
 FROM users
 WHERE account_id = 38 <-var id here
 GROUP BY userlevel_id

Итак, я использую CakePHP 3.X и хочу сгруппировать/подсчитать уровень каждого пользователя по учетной записи, вот что я «делал»,

Например, у меня было три таких вызова поиска, один для администраторов, менеджеров и пользователей.

  $CountManagers = $UsersTable->find('all') //Get current total of managers
                                ->where(['Users.account_id' => $AccountID, 'Userlevels.userlevel' => 'Manager'])
                                ->contain(['Userlevels'])
                                ->count();

Затем я бы создал массив, который мне понадобится для каждого уровня пользователей, после подсчета, если уровень «учетной записи» был больше/меньше, чем установленный уровень учетной записи.

Например,

  if ($CountAdmins < $PackageAdmins) { $ListAccessLevels['2'] = 'Admin'; }
  if ($CountManagers < $PackageManagers) { $ListAccessLevels['3'] = 'Manager'; }
  if ($CountUsers < $PackageUsers) { $ListAccessLevels['4'] = 'User'; }

Но я знаю, что это неправильно, и хочу иметь только один вызов find и заставить его вернуть мне массив.

В этой системе есть около 4 различных уровней, каждый из которых имеет определенное количество пользователей, менеджеров и администраторов (некоторые из которых установлены на NULL, без ограничений).

Итак, это то, что я сделал до сих пор,

  $GetTest = $UsersTable->find('all')
                                 ->where(['account_id' => $AccountID*])
                                 ->contain(['Userlevels'])
                                 ->toArray();

* Это возвращает всех пользователей для всех текущих пользователей, $AccountID получает текущий AccountID вошедшего в систему пользователя.

Итак, я получаю список из шести пользователей, 1 администратора, 1 менеджера и 4 пользователей. (Тестовый аккаунт). Когда я добавляю группу, например,

  $GetTest = $UsersTable->find('all')
                                 ->where(['account_id' => $AccountID*])
                                 ->group('userlevel_id')
                                 ->contain(['Userlevels'])
                                 ->count();

Это возвращает 3, а не то, что мне нужно! Итак, я просматривал подзапрос, а затем считал каждое userlevel_id, но я не уверен, как это сделать?

Спасибо,

  • Если я не включил ничего необходимого, дайте мне знать, и я обновлю свой вопрос...

person C0ol_Cod3r    schedule 15.09.2015    source источник


Ответы (1)


Я полагаю, что это решение, требующее дополнительной работы, но, судя по множеству следов и ошибок, оно дает мне тот же результат в CakePHP, что и SQL (см. выше), который я запускаю в phpMyAdmin.

$Query = $UsersTable->find('all');

$Query->select([ 
              'userlevel_id',
              'count' => $Query->func()->count('*')
            ])
     ->where(['account_id' => $AccountID])
     ->group('userlevel_id');

foreach ($Query as $row) {
   debug($row);
}
person C0ol_Cod3r    schedule 15.09.2015
comment
Эта доза работает, по крайней мере, для этого этапа запроса, который я создаю. Есть еще кое-что, что я хочу сделать с запросом, с которым у меня проблемы, но это больше SQL-запрос. Поскольку я думаю, что этот проект перейдет на Syfomy2, что может быть лучше для конечного результата! Но пока это работает для всех, кому нужно сделать что-то подобное :) - person C0ol_Cod3r; 17.09.2015