Вызов функции-члена getNbr () для массива - PullRequest
0 голосов
/ 13 мая 2019

Я хочу выбрать всех пользователей в базе данных, которые имеют роль только ROLE_USER, но я получаю эту проблему, когда я вызываю функцию, которая говорит: «Вызов функции-члена 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 ]

1 голос
/ 14 мая 2019

Похоже, в коде происходит довольно много вещей:

1) $us->getRepository('AppBundle:Usr'), вероятно, опечатано и должно быть взамен $us->getRepository('AppBundle:User') (?) Как правило, было бы безопаснее использовать $us->getRepository(AppBundle\User::class), чтобы синтаксические ошибки могли быть обнаружены легче / раньше.

2) Вы пытаетесь вызвать метод хранилища для массива с $locationus->getNbr(), что неверно для нескольких учетных записей (нельзя вызывать функции для массивов - и методы хранилища также нельзя вызывать из сущностей).

3) почему код использует echo?

4) в качестве дополнительного примечания (при условии, что это приблизительно полный предполагаемый код), имеет смысл переместить все методы получения и обработки в раздел if, чтобы код работал лучше (он не делает ненужных запросы к базе данных и т. д., когда у пользователя недостаточно прав для доступа к представлению / информации).

Если я правильно понял намерение, в этом случае вторая функция хранилища getNbr здесь излишня. Если он намеревается просто рассчитать количество экземпляров, возвращаемых первой находкой:

 $locationus = $us->getRepository('AppBundle:User')->findBy(['roles' => ["ROLE_USER"] ]);
 $nb_us = count($locationus);

Или, в качестве альтернативы (если вы хотите использовать и исправить getNbr функцию хранилища), тогда вам не нужен первый метод получения хранилища. Для этого также потребуется переписать функцию хранилища:

 $nb_us = $us->getRepository('AppBundle:User')->getNbr("ROLE_USER");
1 голос
/ 14 мая 2019

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
      ));
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...