Symfony 4-无法访问我的实体收藏

时间:2019-09-05 13:39:34

标签: symfony collections doctrine

我有一个带有用户实体和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表:

enter image description here

当我在我的用户的控制器(用户号为1)中进行转储时:

$soldeConges = $this->getUser()->getSoldeConges();
        dump($soldeConges);

我有:

enter image description here

那么,为什么不能访问我的User SoldeConges集合?

2 个答案:

答案 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();
    }
}