2016-10-28 4 views
1

Ich möchte schaffen so etwas wie:verschachtelte ODER-Bedingung mit Laravel Eloquent

select * from documents where 'chapter'=3 and 'section'=4 and ('title' like '%abc% OR 'desc' like %abc%);

Wie kann ich diese mit Eloquent tun? Ich habe versucht, die whereOr Methode von Eloquent zu verwenden, aber das scheint nichts in dem generierten SQL zu tun. Aber selbst wenn, dann bin ich mir nicht sicher, ob mein aktueller Code sie so einbetten würde, wie ich es suche.

Manches, was ich habe:

$docSearch = DB::table('documents'); 

    if ($chapter > 0) { 
     $docSearch->where('chapter', $chapter); 
    } 

    $existingManagementArray = Management::getAllManagementIDsAsArray(); 
    if ($management_id > 0 && in_array($management_id, $existingManagementArray)) { 
     $docSearch->where('management_id', $management_id); 
    } else { 
     $docSearch->whereIn('management_id', $existingManagementArray); 
    } 

    if (strlen($term) > 0) { 
     //HELP! These don't seem to change the SQL 
     $docSearch->whereOr('title', 'like', "%$term%"); 
     $docSearch->whereOr('desc', 'like', "%$term%"); 
    } 

    DB::enableQueryLog(); 
    $allFoundDocs = $docSearch->get(); 
    dd(DB::getQueryLog()); 

Antwort

0

Dies sollte für Sie arbeiten:

DB::table('documents')->where('chapter', 3) 
    ->where('section', 4) 
    ->where(function($q) use($abc) { 
     $q->where('title', 'like', '%'.$abc.'%') 
      ->orWhere('desc', 'like', '%'.$abc.'%'); 
    })->get(); 

eine Closure in die where() Methode Passing weist den Query Builder eine Einschränkung ist.Das zu beginnen Closure empfängt eine Abfrage-Builder-Instanz, mit der Sie die Einschränkungen festlegen können, die in der Klammergruppe enthalten sein sollen.

Docs (Abschnitt namens Parametergruppierung)

+0

Dies funktionierte gut. Kannst du ein bisschen beschreiben, was hier vor sich geht? Ich habe in den beredten Dokumenten nicht das Überschreiten einer Funktion gesehen. – zundi

+0

@zundi, nun, Sie können closure (function) an 'where()' method übergeben und erweiterte Constrains zum übergeordneten 'where()' hinzufügen. Sie können mehrere Ebenen von geschachtelten 'where()' machen. Vergessen Sie nicht, 'use()' zu verwenden, wenn Sie einige Daten an den Abschluss übergeben möchten. –

+1

Etwas Neues gelernt, danke Alexey – zundi