Symfony3 queryBuilder如何用OR搜索以及如何搜索substring?

时间:2017-07-27 07:03:29

标签: php mysql symfony doctrine-orm

我正在使用Symfony制作应用程序,我正在创建数据库和存储库。我需要创建一个查询,从表orders中选择日期为今天(字段datedatetime)并且user属性与{{1}匹配的位置变量或search属性与product变量匹配。匹配也必须不区分大小写。简单地说 - 用户选择日期(今天,所有时间或最近7天)并键入字符串,我需要获得指定日期(今天,所有时间或过去7天)的所有订单订单中的search包含productsearch属性包含user。这是我到目前为止所拥有的

search

我必须匹配 $queryBuilder-> where('DATE_DIFF(orders.date, CURRENT_DATE()) = 0')-> andWhere("order.user LIKE '%search%'")-> setParameter('search',$search); user属性,我需要匹配字符串的一部分,而不是整个字符串。

例如,如果用户搜索product,我需要匹配用户mike或产品Mike Johnson

我考虑过将mike用于两者,但即使其他搜索都错误,它也会与日期匹配。所以我使用orWhere,但是现在我应该如何添加第三个标准?我想在andWhere中添加OR。

我在这里看到了许多答案,但其中大部分都是陈旧的。有些是5年前的。我不知道'DATE_DIFF'是否是正确的方法,或者addWhere是否也是正确的方法。在使用Doctrine的Symfony中,我可以使用LIKE进行简单查询并将其全部写下来。但是,我想使用queryBuilder的全部容量,并尽可能使用最少量的关键字,如SELECT或“OR”(双关语)。

1 个答案:

答案 0 :(得分:3)

尝试改变这个:

andWhere("order.user LIKE '%search%'")

到此:

andWhere("order.user LIKE '%search%' OR product.user LIKE '%search%'")

或者你可以尝试更复杂的东西(我现在没有尝试过,但概念很清楚):

$queryBuilder
     ->where('DATE_DIFF(orders.date, CURRENT_DATE()) = 0')
     ->andWhere($qb->expr()->orX(
          $qb->expr()->like('order.user', '%search%'),
          $qb->expr()->like('product.user', '%search2%')
     ))
     setParameters(
        [
            'search' => $search,
            'search2' => $search,
        ]
     );

Documentation