ОБНОВЛЕНИЕ
Я играл с чистым 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
, но я не уверен, как это сделать?
Спасибо,
- Если я не включил ничего необходимого, дайте мне знать, и я обновлю свой вопрос...