2017-07-27 72 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

用新的解決方案更新答案,但我認爲對於你的情況更好的是第一個@ЛуциПетков –