Как построить запрос на основе условий в 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();

Как этот код можно перевести, чтобы он работал в Laravel?

Ответ 1

В Fluent вы можете:

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

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

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

$result = $query->get();

Ответ 2

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

$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

Ответ 3

Начиная с 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.

Ответ 4

Если вам нужно использовать 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 об этом.

Ответ 5

Вы можете использовать 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

Ответ 6

Я не видел это здесь. Вы даже можете начать свой запрос как

$modelQuery = Model::query();

а затем цепочка другой команды запроса. Может быть, это будет полезно для кого-то нового.

Ответ 7

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

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

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

                    })

Ответ 8

Мы можем написать так (точнее):

$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. Вот запрос тяги.