我有以下实体:
/**
* @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”不会改变任何事情:(
您必须加入并选择您的关联才能获取对象而不是代理。
在此处检查文档。
来自文档的示例:
// 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();
}
“当您一次(通过联接)一次检索产品和类别数据时,Doctrine将返回真正的Category对象,因为不需要延迟加载任何内容。”
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句