Laravel Eloquent - Где пункт игнорируется - PullRequest
0 голосов
/ 03 марта 2020

У меня есть метод фильтра в моем контроллере, который очень прост. Он корректно фильтрует по проекту и клиенту, но статусная часть просто игнорируется. Делать это прямо на базе данных работает. Я подозреваю, что это связано со статусом, являющимся строкой. Допустимые состояния: «C» и «O». Никогда не сталкивался с этим раньше. Заранее спасибо!

Редактировать: Я хочу, чтобы цепочки вызовов назывались "И", мне нужны результаты, чтобы удовлетворить все 3 критерия. Тем не менее, он возвращает событие всех моделей, если я сократил запрос до: Job::with(['users', 'project', 'files']) ->where('status', $status); Как это может произойти? Я не понимаю.

Редактировать 2: Ад, даже Job :: where ('status', $ status) -> get (); не может принести записи, где статус = 'C' или 'O', в то время как он работает, если я запрашиваю прямо в базе данных

public function doFilter($customer_id, $project_id, $status)
{
    $jobs = collect();
    if ($customer_id || $project_id || $status) {
        $query = Job::query()->with(['users', 'project', 'files']);
        $query->when($project_id, function ($query, $project_id) {
            return $query->where('project_id', $project_id);
        });
        $query->when($customer_id, function ($query, $customer_id) {
            return $query->where('customer_id', $customer_id);
        });
        $query->when($status, function ($query, $status) {
            return $query->where('status', $status);
        });
        // dd($status);
        $jobs = $query->get();
    }
    return $jobs;
}

1 Ответ

2 голосов
/ 03 марта 2020

В приведенном выше примере будут получены следующие значения: SQL

"select * from `jobs` where (`status` = ?) and (`customer_id` = ?) (`project_id` = ?)"

Что означает, что соответствующие записи из таблицы заданий должны удовлетворять всем where пунктам

Вы может исправить это, используя

public function doFilter($customer_id, $project_id, $status)
{
    $jobs = collect();
    $query = Job::query()->with(['users', 'project', 'files'])->where(function($query) use ($status) {
        $query->when($status, function ($query, $status) {
            // dump('here 1');
            return $query->where('status', $status);
        });
    })->orWhere(function ($query) use ($customer_id) {
        $query->when($customer_id, function ($query, $customer_id) {
            // dump('here 2');
            return $query->where('customer_id', $customer_id);
        });
    })->orWhere(function ($query) use ($project_id) {
         $query->when($project_id, function ($query, $project_id) {
            // dump('here 3');
            return $query->where('customer_id', $project_id);
        });   
    });
    $jobs = $query->get();
    return $jobs;
}

Новый код, который я предоставил, выдаст следующее SQL

"select * from `jobs` where (`status` = ?) or (`customer_id` = ?) or (`project_id` = ?)" // Only one where clause must be satisfied 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...