Ответ 1
В Fluent вы можете:
$query = DB::table('node');
if ($published == true)
$query->where('published', '=', 1);
if (isset($year))
$query->where('year', '>', $year);
$result = $query->get();
Я могу сделать это в 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();
Как этот код можно перевести, чтобы он работал в 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
Начиная с 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.
Если вам нужно использовать 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 об этом.
Вы можете использовать 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();
Если вам нужно создать микро для состояния. следуйте инструкциям ниже.
Напиши код в своем серверном провайдере
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
Я не видел это здесь. Вы даже можете начать свой запрос как
$modelQuery = Model::query();
а затем цепочка другой команды запроса. Может быть, это будет полезно для кого-то нового.
для красноречивого запроса, который я использовал, который выполняется, только если условие имеет значение
->where(function($query) use ($value_id)
{
if ( ! is_null($value_id))
$query->where('vehicle_details.transport_type_id', $value_id);
})
Мы можем написать так (точнее):
$query = DB::table('node')->when($published, function ($q, $published) {
return $q->where('published', 1);
})->when($year, function($q, $year) {
return $q->where('year', '>', $year);
})->get()
Не упоминается в документах Laravel. Вот запрос тяги.
В Laravel> 5.2 вы можете использовать when()
:
$results = DB::table('orders')
->where('branch_id', Auth::user()->branch_id)
->when($request->customer_id, function($query) use ($request){
return $query->where('customer_id', $request->customer_id);
})
->get();
Документы: https://laravel.com/api/5.8/Illuminate/Contracts/Container/Container.html#method_when
Сообщение в блоге: https://themsaid.com/laravel-query-conditions-20160425/