2017-07-27 3 views
1

Ich mache eine App mit Symfony und ich erstelle die Datenbank und das Repository. Ich brauche eine Abfrage zu machen, die aus der Tabelle auswählt orders, wo das Datum heute ist (das Feld date ist datetime) und wo entweder die user Eigenschaft entspricht search Variable oder die product Eigenschaft übereinstimmt search variabel. Bei der Übereinstimmung muss auch zwischen Groß- und Kleinschreibung unterschieden werden. Einfach ausgedrückt - der Benutzer wählt den Datumszeitraum (heute, alle Zeit oder letzten 7 Tage) und gibt eine Zeichenfolge ein, und ich muss alle Aufträge abrufen, die sich am angegebenen Datum (heute, alle Zeit oder letzten 7 Tage) befinden Die product im Auftrag enthält die search oder die user Eigenschaft enthält die search. Hier ist, was ich bisherSymfony3 queryBuilder wie mit OR zu suchen und nach Teilzeichenfolge zu suchen?

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

Ich habe für beide user und product Eigenschaften übereinstimmen und ich brauche einen Teil der Zeichenfolge übereinstimmen, nicht die gesamte Zeichenfolge. Wenn der Benutzer beispielsweise nach mike sucht, muss der Benutzer Mike Johnson oder das Produkt mike übereinstimmen.

Ich dachte über die Verwendung von orWhere für beide, aber es wird nur das Datum übereinstimmen, auch wenn beide anderen Suchen falsch sind. Also habe ich andWhere verwendet, aber wie soll ich jetzt das dritte Kriterium hinzufügen? Ich dachte über das Hinzufügen von OR in der addWhere.

Ich habe viele Antworten hier gesehen, aber die meisten von ihnen sind wirklich alt. Einige sind vor 5 Jahren. Ich habe keine Ahnung, ob "DATE_DIFF" der richtige Weg ist oder ob der LIKE auch der richtige Weg ist. In Symfony mit Doctrine könnte ich für eine einfache Abfrage mit SELECT gehen und alles aufschreiben. Allerdings möchte ich die volle Kapazität des QueryBuilders nutzen und so wenig wie möglich Schlüsselworte wie LIKE oder `OR '(Wortspiel beabsichtigt) verwenden.

Antwort

3

versuchen, dies zu ändern:

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

dazu:

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

Oder Sie können etwas komplexer wie diese versuchen (ich habe jetzt nicht versucht, dies aber das Konzept ist klar) :

$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

Danke, ich dachte auch daran, aber gibt es eine Möglichkeit, die vom QueryBuilder bereitgestellte Funktion zu verwenden, die für mich nützlich sein könnte? –

+0

Update Antwort mit einer neuen Lösung, aber ich denke, dass für Ihren Fall besser ist der erste @ ЛуциПетков –

Verwandte Themen