[英]Call to a member function getNbr() on array
我想選擇數據庫中所有僅具有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();
}
}
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) $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
存儲庫功能)則不需要第一個存儲庫getter。 但是,這也將需要重寫存儲庫功能:
$nb_us = $us->getRepository('AppBundle:User')->getNbr("ROLE_USER");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.