2013-01-06 7 views
11

ich dies in Code Igniter tun könnenWie kann ich eine Bedingung Abfrage in Laravel bauen

$this->db->select(); 
$this->from->('node'); 
if ($published == true) 
{ 
$this->db->where('published', 'true'); 
} 
if (isset($year)) 
{ 
$this->db->where('year >', $year); 
} 
$this->db->get(); 

Ich bin nicht in der Lage dies in Laravel zu tun. Leute können Sie bitte helfen.

Antwort

33

In Fluent können Sie tun:

$query = DB::table('node'); 

if ($published == true) 
    $query->where('published', '=', 1); 

if (isset($year)) 
    $query->where('year', '>', $year); 

$result = $query->get(); 
+0

Dank der Mensch das ist genau das, was ich wissen wollte. Prost Kumpel. –

+4

Dies gibt nur ein Array zurück. Gibt es eine Möglichkeit, eine Sammlung zurückzugeben? –

+0

das funktioniert auch am paginierten Datum, nur tauschen für paginate oder simplePaginate – Sam

7

Hier ist, wie Sie Ihre Abfrage ausführen können:

$year = 2012; 
$published = true; 

DB::table('node') 
->where(function($query) use ($published, $year) 
{ 
    if ($published) { 
     $query->where('published', 'true'); 
    } 

    if (!empty($year) && is_numeric($year)) { 
     $query->where('year', '>', $year); 
    } 
}) 
->get(array('column1','column2')); 

Um weitere Informationen zu finden, empfehle ich in dem Laravel docs durch Fluent und Eloquent zu lesen. http://laravel.com/docs/database/fluent

3

Wenn Sie Eloquent verwenden müssen Sie können es verwenden, wie, ich bin nicht sicher, dass whereNotNull die beste Verwendung ist, aber ich konnte nicht eine andere Methode finden zurück, was wir wirklich ein leeres Abfrageinstanz sein wollen:

$query = Model::whereNotNull('someColumn'); 
if(x < y) 
    { 
     $query->where('column1', 'LIKE', '%'. $a .'%'); 
    }else{ 
     $query->where('column2', 'LIKE', '%'. $b .'%'); 
    } 
$results = $query->get(); 

auf diese Weise noch irgendwelche Beziehungen können noch

01 verwenden Sie in Ihrer Ansicht nach zum Beispiel arbeiten

Es gibt eine gute Menge an Informationen hier http://daylerees.com/codebright/eloquent-queries über diese Art von Sachen.

3

Ab Laravel 5.2.27, können Sie die Kette zu brechen vermeiden, indem Sie Ihre Bedingungen so zu schreiben:

$query = DB::table('node') 
    ->when($published, function ($q) use ($published) { 
     return $q->where('published', 1); 
    }) 
    ->when($year, function($q) use ($year) { 
     return $q->where('year', '>', $year); 
    }) 
    ->get(); 

Eloquent zu verwenden, tauschen nur $query = DB::table('node') mit Node:: aber erkennen, wenn beide Bedingungen nicht erfüllt, bekommt man alles werde in die Tabelle zurück, es sei denn, Sie überprüfen vor dem Abfragen der db/model oder innerhalb der Abfrage selbst nach einer anderen Bedingung.

Beachten Sie, dass $published und $year im lokalen Bereich sein müssen, um von der Schließung verwendet zu werden.

Sie können es übersichtlich und lesbar machen, indem Sie ein Makro erstellen. Siehe: Conditionally adding instructions to Laravel's query builder

0

für eloquent Abfrage verwendet i folgt, wird nur ausgeführt, wenn in dem Zustandswert

->where(function($query) use ($value_id) 
        { 

          if (! is_null($value_id)) 
           $query->where('vehicle_details.transport_type_id', $value_id); 

        }) 
0

hat Sie Model::when() in Bedingung verwenden können, oder können Sie erstellen Builder::micro()

Für Beispiel

$results = Model::where('user_id', Auth::id()) 
    ->when($request->customer_id, function($query) use ($request){ 
     return $query->where('customer_id', $request->customer_id); 
    }) 
    ->get(); 

Wenn Sie Mikro für eine Bedingung dann erstellen müssen. Folgen Sie den Anweisungen unten.

Schreiben thic Code in Ihrem serve Anbieter

Builder::macro('if', function ($condition, $column, $operator, $value) { 
    if ($condition) { 
     return $this->where($column, $operator, $value); 
    } 

    return $this; 
}); 

Verwendung wie below Beispiel

$results = Model::where('user_id', Auth::id()) 
    ->if($request->customer_id, 'customer_id', '=', $request->customer_id) 
    ->get(); 

Ref: themsaid