Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 条令从一中选择多(多对一单向(不同捆绑))_Symfony_Doctrine Orm_Dql_Many To One - Fatal编程技术网

Symfony 条令从一中选择多(多对一单向(不同捆绑))

Symfony 条令从一中选择多(多对一单向(不同捆绑)),symfony,doctrine-orm,dql,many-to-one,Symfony,Doctrine Orm,Dql,Many To One,在一个限制可用选项的遗留项目上工作,让我陷入了一个需要解决以下问题的境地,最好是用条令 我有两个不同捆绑包中的实体,它们具有单向多对一链接 BundleA依赖BundleB,实体的链接与此类似: BundleA/Entity/TheMany: /** * @var TheOne $theOne * @ORM\ManyToOne(targetEntity="BundleB\Entity\TheOne") * @ORM\JoinColumn(name="theone_id", referenc

在一个限制可用选项的遗留项目上工作,让我陷入了一个需要解决以下问题的境地,最好是用条令

我有两个不同捆绑包中的实体,它们具有单向多对一链接

BundleA依赖BundleB,实体的链接与此类似:

BundleA/Entity/TheMany:

/**
 * @var TheOne $theOne
 * @ORM\ManyToOne(targetEntity="BundleB\Entity\TheOne")
 * @ORM\JoinColumn(name="theone_id", referencedColumnName="id", onDelete="SET NULL")
 * 
 */
private $theOne;
从BundleB中,我现在需要选择所有的一个实体,对于每个实体,我需要所有的多个实体

查询还需要对一个实体的任何属性进行排序,或者对多个实体的相关属性计数进行排序

这是相当简单的原则,以建立一个查询,带回所有的一个实体和其中一个为每个实体。。。然而,我在提出一个条令查询时遇到了一些困难,该查询将返回所有相关的多个实体,而不仅仅是一个实体

我希望有人可能遇到过类似的问题,因此有一些见解


这可能解释得不够清楚,在这种情况下,请指示我进一步解释。

因此,您要做的是获取所有的一,并为每一个找到所有的多。但是您想将所有多个元素放在一个数组中,还是想为实体创建一个数组?(我在这里做了什么)


最后,我通过使用GROUP_CONCAT(需要包含的)实现了我所需要的

查询如下所示:

    $queryBuilder->select(
        'to,
        GROUP_CONCAT(DISTINCT tm.id SEPARATOR \',\') as theManyIds, 
        COUNT(DISTINCT tm.id) as HIDDEN theManyCount'
    )
        ->from('BundleB\Entity\TheOne', 'to')
        ->leftJoin(
            'BundleA\Entity\TheMany',
            'tm',
            Join::WITH,
            'to.id = tm.theOne'
        )
        ->groupBy('to.id')
        ->orderBy($sortString, $direction)
        ->setFirstResult($start)
        ->setMaxResults($limit);

我接受了链接两个bundle的后果,这是一个折衷方案——不过,使用本机SQL和结果集映射()可以避免这种情况。

类似的情况,但是这种方法有两个问题,第一个问题是我需要按“TheMany”的数量对一个bundle的列表进行排序与任何给定实体关联的实体。另一个问题是BundleA没有BundleB的可见性。我不能介绍这个链接,因为它是一个循环依赖项。BundleA需要BundleB,但BundleB不需要BundleA(由于composer之类的循环依赖性问题,我无法将其作为需求添加)。事实上,这两个bundle是相互依赖的,应该合并,但出于各种原因,我不能这样做。另一点是,对于这个任务来说,如果我得到了许多实体的实际数据,这并不重要,实际上我只需要一个逗号分隔的ID列表。我觉得我可能不得不求助于SQL而不是DQL。好的,首先,如果我得到了你的要求,我会更改代码,这样你就可以得到一个按链接数量排列的订单列表,但我不明白为什么BundleB不应该被识别。如果您只是添加
使用Path\of\BundleB这应该行得通。BundleB不能作为BundleA的要求,因为BundleB已经是BundleA的要求。我不能引入循环依赖,而且在这两个bundle之间添加耦合是一种不好的做法(尽管如前所述,它们应该是同一个bundle)。在应用程序中,这不是问题,因为两个捆绑包在实践中总是存在的,但是对于自动化测试,每个捆绑包必须能够作为独立的捆绑包(加上任何依赖项)通过其全套测试。
    $queryBuilder->select(
        'to,
        GROUP_CONCAT(DISTINCT tm.id SEPARATOR \',\') as theManyIds, 
        COUNT(DISTINCT tm.id) as HIDDEN theManyCount'
    )
        ->from('BundleB\Entity\TheOne', 'to')
        ->leftJoin(
            'BundleA\Entity\TheMany',
            'tm',
            Join::WITH,
            'to.id = tm.theOne'
        )
        ->groupBy('to.id')
        ->orderBy($sortString, $direction)
        ->setFirstResult($start)
        ->setMaxResults($limit);