【问题标题】:Disable Doctrine automatic queries禁用 Doctrine 自动查询
【发布时间】:2019-07-18 16:31:07
【问题描述】:

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

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

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

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

Doctrine 会自行搜索类别。 但我想禁用它。强制我加入(存储库中的 LEFT 或 INNER

有可能吗?谢谢

【问题讨论】:

    标签: mysql symfony doctrine-orm doctrine symfony4


    【解决方案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();
    }
    

    现在从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();
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 2012-09-24
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 2011-12-31
        相关资源
        最近更新 更多