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

3

更新

我一直在使用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

我正在使用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'; }

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

该系统大约有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,但我不确定如何做到这一点?

谢谢。

  • 如果我没有包含任何必要的内容,请让我知道,我会更新我的问题...
1个回答

13

认为这是解决方案,还需要更多的工作,但从许多尝试和错误中看来,在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);
}

这个确实有效,至少对于我正在构建的查询阶段是这样。我想在查询中做更多的事情,但我遇到了一些问题,不过那更多是SQL查询的问题。因为我认为这个项目将转移到Syfomy2,这可能对最终结果更好!但现在,对于任何需要做类似操作的人来说,这个方法都是有效的 :) - C0ol_Cod3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接