在查询生成器和Symfony2之间

时间:2014-12-17 13:20:25

标签: php symfony doctrine query-builder

用户采用高级搜索的形式。他可以输入一些值,以及一些范围滑块价格(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的帖子。我做错了什么?

1 个答案:

答案 0 :(得分:3)

我只是快速看一下,但我认为这与您使用orWhere()的事实有关。不应该是andWhere()吗?

现在,您的查询可能会返回价格介于t.bag = :bagOR之间$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;
}