使用Symfony 4.2和Doctrine,我想禁用自动查询。
如果我执行这个简单的例子:
$posts = $em->getRepository(Post::class)->findAll();
foreach ($posts as $post) {
dump($post->getCategory()->getName();
}
学说将自己搜索类别。但我想禁用它。强迫我加入(存储库中的LEFT或INNER)。
这是可能的 ?谢谢
通过访问链接的实体属性从数据库中获取隐式数据是Doctrine的核心原则之一,无法禁用。如果您只想显式获取某些数据 - 您需要构建自己的部分查询并将数据水合为数组或简单对象,这样您获取的结果就不会成为实体。
没有什么可以自动禁用此行为并强制您编写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();
}
从getName()
实体调用Category
方法现在会抛出错误,并且不会启动任何隐藏的SQL查询。如果你想一起玩帖子和类别,那么你可以调整你的findAll()
方法,如下所示:
public function findAll(){
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('p, c')
->from('Post', 'p');
->join('p.category', 'c')
return $qb->getQuery()->getResult();
}