Doctrine - DQL - 如何查询查询结果?

时间:2016-10-20 11:31:13

标签: symfony doctrine-orm

我没有找到如何查询(使用DQL)第一个DQL查询的结果。

我有第一个DQL查询,如:

$query = $this->createQueryBuilder('q')
$query->[methods()]
$query->->getQuery()->getResult();

从这个查询结果我想做另一个DQL查询。但方法getResult返回一个数组。

获得的完美解决方案是对第一个查询的结果执行另一个DQL查询。它有什么解决方案吗?

编辑:我在存储库文件中查询(" [Entity] Repository.php")。从我的第一个Doctrine查询开始,我期待得到第一个结果。从这个结果我想执行另一个选择查询 换句话说,我想知道如何改变'我在' 临时'中的第一次查询结果我将从中执行另一个Doctrine查询。

3 个答案:

答案 0 :(得分:1)

如果您需要使用其他查询的结果进行查询,则可以使用子查询。例如:

$qb  = $this->createQueryBuilder('qb')->where('r.name = :name')->setParameter('name', $name);
$qb2 = $this->createQueryBuilder('qb2');

$qb->andWhere(
    $qb->expr()->in(
        'r.id',
        $qb2->select('u.id')
            ->from('AppBundle:User', 'user')
            ->getQuery()->getDQL()
    )
);

答案 1 :(得分:0)

你无法完全按照自己的想法行事。 Doctrine为每个查询在RDBM中创建临时表或其他工件是愚蠢的。

那就是说,你的用例并不是完全疯狂的;我可以想象一个用例,你想要一个初始的"宽的"结果集,然后是其较窄的子集。

我可以想到两种方法来解决这个问题:

  1. 利用单个QueryBuilder实例按顺序执行两个查询,并在此过程中添加其他条件。

  2. 从ArrayCollection中的getResult()中包装数组,并使用criteria API过滤集合。标准API不能执行原始DQL查询可以执行的所有操作,但它非常强大。

  3. 我从标准API开始。过滤发生在内存中,避免了数据库的另一次往返,并且(通常更重要的是)一堆水合开销。

答案 2 :(得分:0)

这听起来像是你正在寻找使用Doctrine的DTO功能。它允许您创建一个数据传输对象,该对象是根据从单个实体或多个实体收集的不同值构建的。 "NEW" Operator Syntax

如果您只想检索单个结果并且不想迭代多个结果,则可以使用getOneOrNullResult()方法。

$query = $this->createQueryBuilder('q');
...
$query->select('NEW MyDTO(q.id, q.name, q1.id)');
$dto = $query->->getQuery()->getOneOrNullResult();

返回的DTO将包含从您想要获取的各种表中检索的原始值。

要记住的一件重要事情是Doctrine ORM处理实体。它不会返回几个选定的字段。您可以使用partials选择特定字段,但强烈建议不要这样做。使用DTO是首选,因为它们不会被缓存并提供更好的运输工具。