禁用Doctrine自动查询

问题描述 投票:0回答:2

使用Symfony 4.2和Doctrine,我想禁用自动查询。

如果我执行这个简单的例子:

$posts = $em->getRepository(Post::class)->findAll();

foreach ($posts as $post) {
    dump($post->getCategory()->getName();
}

学说将自己搜索类别。但我想禁用它。强迫我加入(存储库中的LEFT或INNER)。

这是可能的 ?谢谢

mysql symfony doctrine-orm doctrine symfony4
2个回答
3
投票

通过访问链接的实体属性从数据库中获取隐式数据是Doctrine的核心原则之一,无法禁用。如果您只想显式获取某些数据 - 您需要构建自己的部分查询并将数据水合为数组或简单对象,这样您获取的结果就不会成为实体。


1
投票

没有什么可以自动禁用此行为并强制您编写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();
}
© www.soinside.com 2019 - 2024. All rights reserved.