我有一个以下实体:
/**
* @ORMEntity(repositoryClass="AppRepositoryCourseLevelRepository")
*/
class CourseLevel
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @var CourseLevel
*
* @ORMManyToOne(targetEntity="AppEntityCourseLevel", fetch="EAGER")
* @ORMJoinColumn(nullable=true, referencedColumnName="id")
*/
private $nextCourseLevel;
...
}
如您所见,它构建了一个树结构,因此任何记录都可以通过 ManyToOne 关系指向它的父级$nextCourseLevel。
然后我在存储库中获取带有查询的元素列表:
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 的对象,它是应用程序\实体\课程级别的对象($nextCourseLevel设置为对象 id = 2,这是一个代理( - id = 2 的对象,这是一个代理对象。
发生这种情况可能是因为关系 - id=1 的对象指向 id=2 作为父级。
但是,我如何强制将所有数据作为真实对象而不是代理获取?输入 fetch="EAGER" 不会改变任何:(
您必须加入并选择您的关联才能获得对象而不是代理。
在此处查看文档。
文档中的示例:
// src/Repository/ProductRepository.php
public function findOneByIdJoinedToCategory($productId)
{
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT p, c
FROM AppEntityProduct p
INNER JOIN p.category c
WHERE p.id = :id'
)->setParameter('id', $productId);
return $query->getOneOrNullResult();
}
"当您一次检索产品和类别数据(通过联接(时,Doctrine 将返回真正的 Category 对象,因为不需要延迟加载任何内容。">