CakePHP 3,计数/组查找结果?

C0o*_*d3r 2 mysql cakephp cakephp-3.0

UPDATE

我一直在使用phpMyAdmin中的纯SQL,并认为我有一个答案,我希望有人看一看,看看查询本身是否有任何问题.

另外我不确定最好的方法是什么,我知道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
Run Code Online (Sandbox Code Playgroud)

所以我使用CakePHP 3.X,并希望按帐户对每个用户级别进行分组/统计,这就是我正在做的事情,

例如,我有三个这样的查找呼叫,一个用于管理员,经理和用户.

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

然后,我会计算出每个用户级别所需的数组,计算出"帐户"级别是否比帐户级别设置的更多/更少.

例如,

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

但我知道这是错误的,并希望只有一个查找调用,并让它为我返回数组.

此系统有大约4个不同的级别,每个级别都有许多用户,管理员和管理员(其中一些设置为NULL,无限制).

所以这就是我到目前为止所做的,

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

*返回所有当前用户的所有用户,$AccountID获取登录用户的当前AccountID.

所以我得到了六个用户的列表,1个管理员,1个管理员和4个用户.(测试帐户).当我添加组,像,

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

这返回3,而不是我需要的!所以我在看一个子查询,然后计算每个,userlevel_id但我不知道该怎么做?

谢谢,

  • 如果我没有包含任何需要的内容,请告诉我,我会更新我的问题......

C0o*_*d3r 9

相信这是解决方案,需要更多工作,但似乎从大量的跟踪和错误中,在CakePHP中给出与在phpMyAdmin中运行的SQL(见上文)相同的结果.

$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);
}
Run Code Online (Sandbox Code Playgroud)