没有什么可以自动禁用此行为并强制您编写 JOIN 子句,除非您愿意。
这种行为(称为延迟加载)是所有 ORM 的主要常见行为之一。
如果您对此不满意(并且您可能有充分的理由),请考虑编写您自己的 DQL 查询,这些查询仅限于您选择的字段。之后不会自动获取查询中未包含的内容。
在您的自定义 PostRepository 类中编写此方法:
public function findAll(){
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('p')
->from('Post', 'p');
return $qb->getQuery()->getResult();
}
然后在你的控制器中,你可以像以前一样做:
$posts = $em->getRepository(Post::class)->findAll();
foreach ($posts as $post) {
dump($post->getCategory()->getName();
}
现在从Category 实体调用getName() 方法会引发错误,并且不会在后面启动任何隐藏的SQL 查询。如果您想同时使用帖子和类别,那么您可以像这样调整您的 findAll() 方法:
public function findAll(){
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('p, c')
->from('Post', 'p');
->join('p.category', 'c')
return $qb->getQuery()->getResult();
}