Как я могу построить запрос на основе условий в laravel

Я могу сделать это в Code Igniter

$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(); 

Я не могу это сделать в Ларавеле. Ребята, пожалуйста, помогите.

Solutions Collecting From Web of "Как я могу построить запрос на основе условий в laravel"

В Fluent вы можете делать:

 $query = DB::table('node'); if ($published == true) $query->where('published', '=', 1); if (isset($year)) $query->where('year', '>', $year); $result = $query->get(); 

Вот как вы можете выполнить свой запрос:

 $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') ); 

Чтобы найти дополнительную информацию, я рекомендую читать через Fluent и Eloquent в документах Laravel. http://laravel.com/docs/database/fluent

Если вам нужно использовать Eloquent, вы можете использовать его как, я не уверен, что whereNotNull лучше всего использовать, но я не смог найти другой метод, чтобы вернуть то, что мы действительно хотим быть пустым экземпляром запроса:

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

Таким образом, любые отношения все еще работают, например, по вашему мнению, вы все еще можете использовать

 foreach($results as $result){ echo $result->someRelationship()->someValue; } 

Здесь есть много информации о http://daylerees.com/codebright/eloquent-queries о подобных материалах.

Начиная с Laravel 5.2.27 , вы можете избежать разрыва цепи, написав свои условия так:

 $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, просто замените $query = DB::table('node') на Node:: но поймите, что если оба условия терпят неудачу, вы получите все в таблице, если вы не проверите какое-либо другое условие перед тем, как запросить db / модели или из самого запроса.

Обратите внимание, что $published и $year должны быть в локальной области, которые будут использоваться закрытием.

Вы можете сделать его более понятным и понятным, создав макрос. См .: Условное добавление инструкций в построитель запросов Laravel

для красноречивого запроса, который я использовал после этого, выполняется только в том случае, если условие имеет значение

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

Вы можете использовать Model::when() в состоянии или вы можете создать Builder::micro()

Например

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

Если тогда вам нужно создать микро для условия. следуйте инструкциям ниже.

Напишите код thic в вашем сервере

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

Использовать как ниже пример

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

Ссылка: themsaid