Результаты фильтрации Laravel Eloquent - PullRequest
0 голосов
/ 18 апреля 2019

В моем контроллере я получаю список сообщений из модели сообщений.Я пытаюсь добавить фильтр, но фильтры отменяют друг друга.

// Controller
public function __construct(Message $messages)
{
    $this->messages = $messages;
}

public function index($filter = null)
{
    $messages = $this->messages
        ->actioned($filter == 'actioned' ? false : true)
        ->ignored($filter == 'ignored' ? true : false)
        ->get();

    return view('...
}

// Model
public function scopeActioned($query, $actioned = true)
{
    $constraint = ($actioned ? 'whereNotNull' : 'whereNull');

    return $query->$constraint('ts_actioned');
}

public function scopeIgnored($query, $ignored = true)
{
    return $query->where('is_ignored', ($ignored ? 'Yes' : 'No'));
}

Как настроить Eloquent так, чтобы scopeActioned вызывался только в том случае, если для $ filter установлено значение 'actioned' и то же самоедля игнорируемых?

1 Ответ

1 голос
/ 18 апреля 2019

Простой подход:

public function index($filter = null)
{
    $query = $this->messages->query();
    //applying filter
    if($filter == 'actioned') {
        $query->actioned();
    }
    if($filter == 'ignored') {
        $query->ignored();
    }

    $messages = $query->get();

    return view('...
}

Еще один подход - работа в Scope Function.

// Model
public function scopeActioned($query, $actioned = true)
{
    if($actioned) {
        $query->whereNotNull('ts_actioned');
    }

    return $query;
}

public function scopeIgnored($query, $ignored = true)
{
    if($ignored) {
        $query->where('is_ignored', 'Yes');
    }

    return $query;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...