带有条件的 Symfony 请求(And Where,OrWhere)

Posted

技术标签:

【中文标题】带有条件的 Symfony 请求(And Where,OrWhere)【英文标题】:Sympfony Request (AndWhere, OrWhere) with conditions 【发布时间】:2021-08-11 09:56:06 【问题描述】:

我有 2 个 DQL 查询

我希望用户(使用选择表单)能够选择:

    一次过滤 1 个。无论是派对还是城市

    同时使用多个过滤器:派对 + 城市...然后是其他过滤器。

总结: 在我的数据库中有派对和城市。用 select 的形式。用户必须能够选择他想要的过滤器。如果他选择了一个特定的派对而没有指定城市,这将显示所有城市中的所有派对。他也可以选择一个城市,在这种情况下,他将拥有所选城市的所有党派。或者第三种情况,他选择了一个派对 + 一个城市。

当一个工作时,另一个不工作。 我认为我的条件和运营商有问题。 我读到使用 orWhere () 是不好的做法。

提前谢谢你。

 public function searchByParty($party, $city)


    $query = $this->createQueryBuilder('s');
    $query = $query
        ->select( 'party', 'city', 's')
        ->join ('s.party', 'party ')
        ->join ('s.city', 'city');

   
    if (!empty($party) === !empty($city))  
        $query = $query
            ->andWhere('party .id = :sport')
            ->andWhere('city.id = :city')
            ->setParameter('party ', $party )
            ->setParameter('city', $city);
    

    if (!empty($party) && !empty($city)) 
        $query = $query
            ->orWhere('party.id = :party')
            ->orWhere('city.id = :city')
            ->setParameter('party', $party )
            ->setParameter('city', $city);
    

    return $query->getQuery()->getResult();

【问题讨论】:

【参考方案1】:

你有一个逻辑问题。您的第一个if 检查$party$city 的存在是否等价,当且仅当两者都存在或两者都不存在时才成立。如果它们都不存在,则检查它们的值是没有意义的。第二个if 检查是否都没有定义。在这种情况下,对照它们检查值是没有意义的。修复:

public function searchByParty($party, $city) 

$query = $this->createQueryBuilder('s');
$query = $query
    ->select( 'party', 'city', 's')
    ->join ('s.party', 'party ')
    ->join ('s.city', 'city');


if (!empty($party)) 
    $query = $query
        ->andWhere('party .id = :sport')
        ->setParameter('party ', $party )


if (!empty($city)) 
    $query = $query
        ->andWhere('city.id = :city')
        ->setParameter('city', $city);


return $query->getQuery()->getResult();


编辑:如果您想检查它们是否匹配,请使用 orWhere:

public function searchByParty($party, $city) 

$query = $this->createQueryBuilder('s');
$query = $query
    ->select( 'party', 'city', 's')
    ->join ('s.party', 'party ')
    ->join ('s.city', 'city');


if (!empty($party)) 
    $query = $query
        ->orWhere('party .id = :sport')
        ->setParameter('party ', $party )


if (!empty($city)) 
    $query = $query
        ->orWhere('city.id = :city')
        ->setParameter('city', $city);


return $query->getQuery()->getResult();


【讨论】:

谢谢Lajos,它独立工作,但是当你同时选择两个时它不起作用 @Dev 因为您的问题陈述“它不起作用”非常模糊,我只能猜测其意图是什么。显然我的第一个猜测与您的意图不符。我已经编辑了我的答案,请检查我的第二个猜测是否正确估计了您的意图。 我实际上希望用户能够同时使用单选或多选进行过滤。与 andWhere 它可以与多个选择一起使用,但不能只与一个选择一起使用,这与 orWhere 不同。在我看来,答案在于条件和运营商。感谢您的帮助。 @Dev 我还是不明白这个要求。我的回答能解决问题吗?如果是这样,您可以考虑接受它作为正确答案。如果没有,请编辑您的问题并提供更好的问题描述。请提供一些城市和政党的样本数据和样本值,以及带有相关参数的相关样本的预期结果。我很难理解确切的意图是什么。如果你重新阅读你的问题并思考一下,对你的项目一无所知的人会理解它吗? Dev,我已经修改了我上面的问题。谢谢的【参考方案2】:

解决方案:

     public function searchBySession($party, $city)


    $query = $this->createQueryBuilder('s');
        $query = $query
            ->select( 's');

        if($party)
            $query = $query
                ->join ('s.party', 'party')
                ->addSelect('party')
                ->andWhere('party.id = :party')
                ->setParameter('party', $party)
            ;
        

        if($city)
            $query = $query
                ->join ('s.city', 'city')
                ->addSelect('city')
                ->andWhere('city.id = :city')
                ->setParameter('city', $city)
            ;
        

    return $query->getQuery()->getResult();

谢谢你

【讨论】:

您能否接受答案,使该问题不被列为未接受?

以上是关于带有条件的 Symfony 请求(And Where,OrWhere)的主要内容,如果未能解决你的问题,请参考以下文章

Symfony - 使用Doctrine创建复杂查询

MySQL 在多个外部连接的子句中放置条件

带有 SQLite 内存数据库的 Symfony / Doctrine UnitTests

设置请求内容以在 symfony 中测试

刀片视图:带有 OR/AND 条件的 if 语句

带有 Symfony 开发服务器的 Alamofire 没有有效的 ssl