Symfony 4/Doctrine 2 - 获取真实对象而不是代理



我有一个以下实体:

/**
* @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 对象,因为不需要延迟加载任何内容。">

相关内容

  • 没有找到相关文章

最新更新