【问题标题】:Doctrine querybuilder with MEMBER OF and empty parameter具有 MEMBER OF 和空参数的 Doctrine querybuilder
【发布时间】:2020-05-17 14:42:46
【问题描述】:

仅当我在参数标记中选择某些内容时,下面的查询才有效,否则它会返回空结果。如果参数标签为空时没有位置限制,我该怎么做才能让它工作。在下面的例子中,f.tags 是实体 Student 和实体标签之间的多对多关系字段。

public function FindStudent($tags)
{
    $qb = $this
        ->createQueryBuilder('s');

    if ($tags) {
        $qb->andWhere(':tag MEMBER OF s.tags')
            ->setParameter('tag', $tags);
    }

    $qb->Select('s');

    return $qb
        ->getQuery()
        ->getResult();
}

在探查器中,当未选择任何内容时,Doctrine 查询的 IN 为空。我要做的是在参数标签为空时根本没有 INNER JOIN 和 WHERE IN。

AND EXISTS (SELECT 1 FROM student_tag f3_ INNER JOIN tag s4_ ON f3_.tag_id = s4_.id WHERE f3_.student_id = f0_.id AND s4_.id IN ())

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    大概

    if(!empty($tags)){
    

    会成功的。

    编辑您的评论: 在这种情况下:

    use Doctrine\Common\Collections\ArrayCollection;
    ....
    if(!empty($tags) && ($tags instanceof ArrayCollection && !$tags->empty())){
    

    【讨论】:

    • 我试过这个,但我有同样的行为。我不知道为什么,因为转储 if(!empty($tags)) 在分析器中给出 'true'。
    • $tags 的值是多少?
    • Dump on $tags 在分析器中返回这个:Doctrine\Common\Collections\ArrayCollection {#1565 ▼ -elements: [] } 如果我选择一些标签,它会返回这个:Doctrine\Common\Collections\ArrayCollection {#1663 ▼ -elements: array:3 [▼ 0 => App\Entity\Saptag {#1635 ▶} 1 => App\Entity\Saptag {#1648 ▶} 2 => App\Entity\Saptag {#1627 ▶} ] } 听起来如果查询构建器在创建查询时不读取条件
    • 谢谢,它有效我只是在 ArrayCollection 的空方法中更改了一个细节:use Doctrine\Common\Collections\ArrayCollection; .... if(!empty($tags) && ($tags instanceof ArrayCollection && !$tags->isEmpty())){
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    相关资源
    最近更新 更多