带有条件的 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)的主要内容,如果未能解决你的问题,请参考以下文章