使用Symfony 4.2和学说,我想禁用自动查询。
如果我执行此简单示例:
$posts = $em->getRepository(Post::class)->findAll();
foreach ($posts as $post) {
dump($post->getCategory()->getName();
}
学说将自己搜索类别。,但我想禁用。迫使我加入(左或内部库中的内部)。
可能吗?谢谢
通过访问链接的实体属性从数据库中获取隐式数据是学说的核心原理之一,不能被禁用。如果您只想明确获取一些数据 - 您需要构建自己的部分查询并将数据作为数组或简单对象进行水合,以便您所取的结果不会成为实体。
没有什么能自动禁用此行为并迫使您写入" wisters"除外。
此行为(称为懒惰加载)是所有ORMS的主要共同行为之一。
如果您对此不满意(并且可能有充分的理由),请考虑编写自己的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();
}