在Symfony中进行多重过滤

时间:2017-09-18 12:55:11

标签: php symfony filter doctrine-orm doctrine

我在我的项目中添加了一个与symfony一起使用的过滤器。

我有ID(要搜索的号码)和客户名称。 当我用一个参数构造我的查询时,它就像那样

def date_of_the_task():
    print("Date of the task")
    print("Please use DD/MM/YYYY format:")
    task_date = input("> ")
    try:
        datetime.datetime.strptime(task_date, '%d/%m/%Y')
    except ValueError:
        print("Incorrect data format, should be DD/MM/YYYY!")
        input("Press enter to continue")
        date_of_the_task()
    return task_date

当我再添加一个参数时,搜索不会发生。

public function findFilter($filter)
    {
        return $this->createQueryBuilder("a")
            ->andWhere('a.id like :id')
            ->setParameter('id', '%' . $filter . '%')
            ->getQuery()
            ;
    }

以下是我可以输入过滤器的视图

public function findFilter($filter)
    {
        return $this->createQueryBuilder("a")
            ->andWhere('a.id like :id')
            ->setParameter('id', '%' . $filter . '%')
            ->andWhere('a.client like :client')
            ->setParameter('client', '%' . $filter . '%')
            ->getQuery()
            ;
    }

所以也许我没有把它们坚持下去? 有人知道如何为过滤条添加更多参数吗?

3 个答案:

答案 0 :(得分:4)

试试这个:

   return $this->createQueryBuilder("a")
        ->andWhere('a.id like :id' OR 'a.client like :client')
        ->setParameters([
             'id' => '%' . $filter . '%',
             'client' => '%' . $filter . '%'
        ]),
        ->getQuery();

答案 1 :(得分:3)

如果您要使用唯一值过滤多个列,则必须使用OR过滤器数组。

use Doctrine\ORM\Query\Expr;

[...]

$orX = new Expr\Orx(); 
$orX->add($qb->expr()->orx($qb->expr()->like('a.id', ':filter'));
$orX->add($qb->expr()->orx($qb->expr()->like('a.client', ':filter'));

$qb
    ->andWhere($orx)
    ->setParameter('filter', '%'.$filter.'%')
;

答案 2 :(得分:3)

您应该使用orWhere代替andWhere

public function findFilter($filter)
{
    return $this->createQueryBuilder("a")
        ->where('a.id like :filter')
        ->orWhere('a.client like :filter')
        ->setParameter('filter', '%' . $filter . '%')
        ->getQuery()
    ;
}

此外,您可能在getResult之后错过了getQuery(但不知道这是否是拼写错误或其他内容)