Я могу сделать это в 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();
Я не могу это сделать в Ларавеле. Ребята, пожалуйста, помогите.
В 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