Symfony 4/Doctrine 2 - 获取真实对象而不是代理
Symfony 4/Doctrine 2 - fetching real object not the proxy
我有以下实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\CourseLevelRepository")
*/
class CourseLevel
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var CourseLevel
*
* @ORM\ManyToOne(targetEntity="App\Entity\CourseLevel", fetch="EAGER")
* @ORM\JoinColumn(nullable=true, referencedColumnName="id")
*/
private $nextCourseLevel;
...
}
如您所见,它构建了一个树结构,因此任何记录都可以通过 $nextCourseLevel 的 ManyToOne 关系指向它的父级。
然后我使用存储库中的查询获取元素列表:
class CourseLevelRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, CourseLevel::class);
}
public function fetchFiltered(array $filters)
{
$builder = $this->createQueryBuilder('cl');
$builder->setFirstResult(0);
$builder->setMaxResults(10)
$builder->orderBy('cl.name', 'asc');
return $builder->getQuery()->getResult();
}
}
让我们假设以下数据集:
id | next_course_level
-------------------------
1 | 2
2 | null
为此,我将收到以下物品:
- id = 1 的对象,它是 App\Entity\CourseLevel 的对象($nextCourseLevel 设置为对象 id = 2,这是一个代理)
- id = 2 的对象,它是一个代理对象。
发生这种情况可能是因为关系 - id=1 的对象指向 id=2 作为父对象。
但是我怎样才能强制获取所有数据作为真实对象,而不是代理?放 fetch="EAGER" 不会改变任何东西:(
您必须加入并 select 您的协会才能获得对象而不是代理。
检查文档 here。
来自文档的示例:
// src/Repository/ProductRepository.php
public function findOneByIdJoinedToCategory($productId)
{
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT p, c
FROM App\Entity\Product p
INNER JOIN p.category c
WHERE p.id = :id'
)->setParameter('id', $productId);
return $query->getOneOrNullResult();
}
"When you retrieve the product and category data all at once (via a join), Doctrine will return the true Category object, since nothing needs to be lazily loaded."
我有以下实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\CourseLevelRepository")
*/
class CourseLevel
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var CourseLevel
*
* @ORM\ManyToOne(targetEntity="App\Entity\CourseLevel", fetch="EAGER")
* @ORM\JoinColumn(nullable=true, referencedColumnName="id")
*/
private $nextCourseLevel;
...
}
如您所见,它构建了一个树结构,因此任何记录都可以通过 $nextCourseLevel 的 ManyToOne 关系指向它的父级。
然后我使用存储库中的查询获取元素列表:
class CourseLevelRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, CourseLevel::class);
}
public function fetchFiltered(array $filters)
{
$builder = $this->createQueryBuilder('cl');
$builder->setFirstResult(0);
$builder->setMaxResults(10)
$builder->orderBy('cl.name', 'asc');
return $builder->getQuery()->getResult();
}
}
让我们假设以下数据集:
id | next_course_level
-------------------------
1 | 2
2 | null
为此,我将收到以下物品: - id = 1 的对象,它是 App\Entity\CourseLevel 的对象($nextCourseLevel 设置为对象 id = 2,这是一个代理) - id = 2 的对象,它是一个代理对象。
发生这种情况可能是因为关系 - id=1 的对象指向 id=2 作为父对象。
但是我怎样才能强制获取所有数据作为真实对象,而不是代理?放 fetch="EAGER" 不会改变任何东西:(
您必须加入并 select 您的协会才能获得对象而不是代理。
检查文档 here。
来自文档的示例:
// src/Repository/ProductRepository.php
public function findOneByIdJoinedToCategory($productId)
{
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT p, c
FROM App\Entity\Product p
INNER JOIN p.category c
WHERE p.id = :id'
)->setParameter('id', $productId);
return $query->getOneOrNullResult();
}
"When you retrieve the product and category data all at once (via a join), Doctrine will return the true Category object, since nothing needs to be lazily loaded."