用户采用高级搜索的形式。他可以输入一些值,以及一些范围滑块价格(jquery ui小部件)。然后在Controller中我获取值并想要查找所有行,其中至少有一个条件将被计算。 这是存储库代码:
public function advancedSearch($bag, $startPrice, $targetPrice)
{
$parameters = ['bag' => $bag];
$query = $result = $this->getEntityManager()
->createQueryBuilder()
->select('t')
->from('VputiTripBundle:Trip', 't');
$query->orWhere('t.bag = :bag');
$query->orWhere(
$query->expr()->between('t.price', $startPrice, $targetPrice)
);
$result = $query
->setParameters($parameters)
->setMaxResults(1)
->getQuery()
->getResult();
return $result;
}
当开始价格和目标价格等于271和278时,我得到价格为300的帖子。我做错了什么?
答案 0 :(得分:3)
我只是快速看一下,但我认为这与您使用orWhere()
的事实有关。不应该是andWhere()
吗?
现在,您的查询可能会返回价格介于t.bag = :bag
和OR
之间$startPrice
$targetPrice
的所有结果,这可以解释您所描述的行为。我猜你也会得到价格合适但bag
属性与$bag
参数不匹配的结果。
编辑:
由于某些过滤器可能未设置,因此您只想在它们应用时应用它们。我认为最好的方法是使用PHP if
语句动态构建查询。例如:
public function advancedSearch($bag, $startPrice, $targetPrice)
{
$parameters = array();
// $query = $result = $this->getEntityManager() ... etc
if (!empty($bag)) {
$query->andWhere('t.bag = :bag');
$parameters['bag'] = $bag;
}
if (!empty($startPrice) && !empty($targetPrice)) {
$query->andWhere(
$query->expr()->between('t.price', $startPrice, $targetPrice)
);
}
// $result = $query->setParameters($parameters) ... etc
return $result;
}