我想选择数据库中所有仅具有ROLE_USER角色的用户,但是当我调用该函数时,他们说“在null上调用成员函数getNbr()”,我得到了这个问题。我认为bcoz我使用Findby() ,bcoz我在另一个调用中使用了相同的功能,因此代码效果很好:
public function indexAction(Request $request)
{
$us = $this->getDoctrine()->getManager();
$locationus = $us->getRepository('AppBundle:Usr')->findBy(
[ 'roles' => ["ROLE_USER"] ]);
echo $nb_us = $locationus->getNbr();
if($authChecker->isGranted(['ROLE_ADMIN']))
{
return $this->render('settingAdmin/profiladmin.html.twig' , array(
'nb_us' => $nb_us,
));
}
这是UserRepository中的另一个功能:
class UserRepository extends \Doctrine\ORM\EntityRepository
{
public function getNbr() {
return $this->createQueryBuilder('l')
->select('COUNT(l)')
->getQuery()
->getSingleScalarResult();
}
}
答案 0 :(得分:1)
getNbr
是UserRepository
类的方法,因此只能对此UserRepository
类实例进行调用。此方法返回用户总数。
findBy
返回实体数组(在您的情况下,所有具有角色ROLE_USER
的用户),而不是UserRepository
类实例,因此不能在以下情况下使用getNbr
这个变量
如果要获取实体数组的长度(对于所有具有角色ROLE_USER
的用户),只需使用count
函数:
echo $nb_us = count($locationus);
if($authChecker->isGranted(['ROLE_ADMIN']))
{
return $this->render('settingAdmin/profiladmin.html.twig' , array(
'nb_us' => $nb_us, 'locationus' => $locationus
));
}
答案 1 :(得分:1)
那里的代码中似乎发生了很多事情:
1)$us->getRepository('AppBundle:Usr')
可能是错字,应该用$us->getRepository('AppBundle:User')
代替(?)通常,使用$us->getRepository(AppBundle\User::class)
会更安全,这样可以更容易/更早地发现语法错误。 / p>
2)您正在尝试使用$locationus->getNbr()
调用数组上的存储库方法,这在多个帐户上是不正确的(您不能调用数组上的函数-并且存储库方法也不能从实体调用)。
3)为什么代码使用echo?
4)作为补充说明(假设这大约是完整的预期代码),将所有吸气剂和处理移入if部分内部是有意义的,这样代码将表现得更好(这不是不必要的)用户没有足够权限访问视图/信息时进行数据库查询等。
如果我正确理解了这个意图,那么在这种情况下,第二个存储库功能getNbr
就多余了。如果这样做只是为了计算第一个查找返回的实例数:
$locationus = $us->getRepository('AppBundle:User')->findBy(['roles' => ["ROLE_USER"] ]);
$nb_us = count($locationus);
或者(如果您想使用getNbr
存储库功能并 fix 进行修复),则不需要第一个存储库获取器。尽管如此,这也将需要重写存储库功能:
$nb_us = $us->getRepository('AppBundle:User')->getNbr("ROLE_USER");