我有一个带有用户实体和SoldeConges实体的Symfony 4项目。 用户具有SoldeConges集合。
但是当我转储$ user-> getSoldeConges()时,集合为空。
我的用户实体:
/**
* @ORM\OneToMany(targetEntity="App\Entity\SoldeConges", mappedBy="user", orphanRemoval=true)
*/
private $soldeConges;
/**
* @return Collection|SoldeConges[]
*/
public function getSoldeConges(): Collection
{
return $this->soldeConges;
}
我的用户有3个soldeConges:
PhpMyAdmin SoldeConge表:
当我在我的用户的控制器(用户号为1)中进行转储时:
$soldeConges = $this->getUser()->getSoldeConges();
dump($soldeConges);
我有:
那么,为什么不能访问我的User SoldeConges集合?
答案 0 :(得分:1)
1)要获得您的soldeConges(这是symfony 3代码,请将其改编为4 ;-)):
$em = $this->getDoctrine()->getManager();
$soldeCongesRepository= $em->getRepository('AppSoldeConges:SoldeConges');
$soldeConges = $soldeCongeRepository->findBy(['userId'=>$this->getUser()->getId()]);
2)这可能是由于Doctrine的延迟加载。 尝试fetch =“ EAGER”(默认为LAZY):
* @ORM\OneToMany(targetEntity="App\Entity\SoldeConges", mappedBy="user", orphanRemoval=true, fetch="EAGER")
答案 1 :(得分:0)
Doctrine,则会立即加载整个集合。转储是您放置dump()语句时的内存模型。
如果您应该首先呈现集合(或者仅当您在集合上使用count()方法时才呈现),然后使用dump()语句,您将看到您的集合已被加载。这是称为延迟加载的系统。必要时它将执行第二个查询。但是您可能知道,如果两个查询可以得到一个查询,那么它应该更好,更快。 另一方面,如果您的实体具有大量馆藏,则可能会遇到严重的问题。在这种情况下,您可以使用“额外的延迟加载”。 (请参阅文档)
无论如何,如果您想立即将集合加载到实体中,则可以使用具有一个或多个JOINS的自己的DQL查询。下面是带有新函数findAllWithJoin的存储库示例。从控制器而不是findAll()调用该函数。
namespace App\Repository;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
class UserRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, User::class);
}
public function findAllWithJoin()
{
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery('SELECT u, sc FROM User u JOIN u.soldeConges sc');
return $query->execute();
}
}