Symfony 条令-DQL-如何查询查询结果?

Symfony 条令-DQL-如何查询查询结果?,symfony,doctrine-orm,Symfony,Doctrine Orm,我没有找到如何使用DQL查询第一个DQL查询的结果 我有第一个DQL查询,如: $query = $this->createQueryBuilder('q') $query->[methods()] $query->->getQuery()->getResult(); 根据这个查询结果,我想做另一个DQL查询。但是getResult方法返回一个数组 get的完美解决方案是对第一个查询的结果执行另一个DQL查询。有什么解决办法吗 编辑:我正在存储库文件[Entity

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

我有第一个DQL查询,如:

$query = $this->createQueryBuilder('q')
$query->[methods()]
$query->->getQuery()->getResult();
根据这个查询结果,我想做另一个DQL查询。但是getResult方法返回一个数组

get的完美解决方案是对第一个查询的结果执行另一个DQL查询。有什么解决办法吗

编辑:我正在存储库文件[Entity]repository.php中查询。从我的第一个条令查询中,我希望得到第一个结果。根据这个结果,我想执行另一个select查询。
换句话说,我想知道如何在“临时”表中“转换”第一次查询的结果,我将从该表执行另一个条令查询。

如果需要使用另一个查询的结果进行查询,可以使用子查询。例如:

$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()
    )
);

你不能完全按照你的想法去做。对于条令来说,在RDBMs中为每个查询创建临时表或其他工件是愚蠢的

也就是说,您的用例并不是完全疯狂的;我可以想象一个用例,在这个用例中,您需要一个初始的宽结果集,然后是一个更窄的子集

我可以想出两种方法:

利用单个QueryBuilder实例按顺序执行两个查询,同时添加其他条件

将getResult中的数组包装到ArrayCollection中,并使用筛选集合。CriteriaAPI不能完成原始DQL查询所能完成的一切,但它非常强大


我将从criteriaapi开始。过滤在内存中进行,避免了对数据库的另一次往返,而且通常更重要的是会产生大量开销。

这听起来像是在使用Doctrine的DTO功能。它允许您根据从单个实体或多个实体收集的不同值创建数据传输对象

如果只希望检索单个结果,而不希望迭代多个结果,则可以使用getOneOrNullResult方法

返回的DTO将包含从要获取的各种表中检索到的原语值


需要记住的一件重要事情是,ORM原则处理实体。它不仅仅返回几个选定的字段。您可以使用选择特定字段,但不鼓励使用这些字段。首选使用DTO,因为它们不缓存,并提供更好的运输工具。

谢谢您的回答。这对最初的问题没有反应。因此,我已经更新了问题。谢谢你的回答。这对最初的问题没有反应。因此,我更新了这个问题。您建议按如下方式执行子查询:从“表”中选择“值”,其中在另一个选择中选择“值”。我想知道如何在第一个查询的结果中进行选择,将第一个结果转换为临时表例如,您想这样做吗?从id位于1、2、3、4中的表中选择*;否:-我想做一些类似的事情:从表中选择*条件作为tmp,然后从tmp中选择*条件我不确定此功能是否在条令上可用。我认为您可以通过子查询或在新查询中设置结果数组来获得这种行为,如:$qb->andWhere Your_new_CONDITIONS->andWhere$qb->expr->in'r.id',$resultArrayIdList。
$query = $this->createQueryBuilder('q');
...
$query->select('NEW MyDTO(q.id, q.name, q1.id)');
$dto = $query->->getQuery()->getOneOrNullResult();