在数组上调用成员函数getNbr()

时间:2019-05-13 20:08:21

标签: php symfony

我想选择数据库中所有仅具有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();

    }
}


2 个答案:

答案 0 :(得分:1)

getNbrUserRepository类的方法,因此只能对此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");