2017-07-27 75 views
1

我正在制作一个Symfony的应用程序,我正在创建数据库和存储库。我需要进行查询,从表orders中选择今天的日期(字段datedatetime),并且其中user属性匹配search变量或product属性匹配search变量。比赛也必须不区分大小写。简单地说 - 用户选择日期时间(今天,所有时间或最近7天)并键入字符串,我需要获取指定日期(今天,所有时间或最近7天)内的所有订单,以及订单中的product包含searchuser属性包含search。以下是我迄今为止Symfony3 queryBuilder如何用OR搜索以及如何搜索子串?

$queryBuilder-> 
       where('DATE_DIFF(orders.date, CURRENT_DATE()) = 0')-> 
       andWhere("order.user LIKE '%search%'")-> 
       setParameter('search',$search); 

我必须符合两个userproduct性质,我需要匹配字符串的一部分,而不是整个字符串。

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

我曾考虑过使用orWhere,但它只会匹配日期,即使其他两个搜索都是错误的。所以我用andWhere,但现在我该如何添加第三个标准?我想过在addWhere中加入OR。

我在这里看到很多答案,但其中大多数都很老。有些来自5年前。我不知道'DATE_DIFF'是否是正确的选择,或者LIKE也是正确的选择。在使用Doctrine的Symfony中,我可以使用SELECT进行简单的查询并将其写下。但是,我想使用queryBuilder的全部容量,并尽可能少地使用像LIKE或'OR'(双关语)这样的关键字。

回答

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

+0

谢谢,我也想过这样做,但是有没有办法使用由queryBuilder提供的功能,可以从某些用途给我? –

+0

用新的解决方案更新答案,但我认为对于你的情况更好的是第一个@ЛуциПетков –