Фильтр Laravel на основе имеет одно отношение - PullRequest
0 голосов
/ 04 июня 2018

Я вытягиваю свои волосы поверх этого, и я чувствую, что перепробовал каждый метод!

Вот моя проблема.

У меня 2 стола

ПОЛЬЗОВАТЕЛИ

ID | FIRSTNAME   | EMAIL_ADDRESS
1  | Joe Bloggs  | joe@bloggs.com 

СОСТОЯНИЕ

ID | USER_ID | STATUS | DATE
1  |  1      | 'In'   | 2018-06-04 09:01:00
2  |  1      | 'Out'  | 2018-06-04 09:00:00

Как видно из приведенных выше таблиц, каждый пользователь может иметь много состояний ', ноу каждого пользователя должен быть один последний статус, который я делаю следующим образом (скажите, пожалуйста, если я делаю это неправильно)

public function statusCurrent(){
    return $this->hasOne('App\Status', 'user_id', 'id')->orderBy('date', 'desc')->limit(1);
}

Затем я вижу форму, которая передает фильтрыКонтроллер через $request.

Мне нужно иметь возможность использовать фильтры и применять их к 1 самому последнему состоянию.Например, если кто-то ищет дату 2018-06-04 09:00:00 и идентификатор пользователя 1, мне нужно, чтобы он отображал НЕТ РЕЗУЛЬТАТОВ, потому что 1 самая последняя запись для этого пользователя не соответствует этой дате, но на данный момент она будетпросто перепрыгните через самый последний, если он не совпадает, и получите следующую запись, которая соответствует.

Я пробовал то, что похоже на каждый метод, я пробовал вот так

$users = Users::with(['StatusCurrent' => function($query){
  $query->where('status.status', 'In');
}])->get();

Который получает правильную самую последнюю строку, но затем, если я пытаюсь вместо этого status.status, 'out', он просто перепрыгивает и получает запись номер 2, где отсутствует статус.

Я также пытался вот так

$users = Users::has('StatusCurrent')->paginate(10);

    if(!empty($request->statusIn)){
        $users = $users->filter(function ($item){
            $item = $item->statusCurrent->status == 'in'; 
            return $item;
        });
    }

return $users;

Это прекрасно работает, но затем разбивается на страницы при попытке добавить любые GET параметры для фильтров.

Простой английский

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

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы должны объединить JOIN с подзапросом:

$users = User::select('users.*')
    ->join('status', 'users.id', 'status.user_id')
    ->where('status.status', 'in')
    ->where('status.id', function($query) {
        $query->select('id')
            ->from('status')
            ->whereColumn('user_id', 'users.id')
            ->orderByDesc('date')
            ->limit(1);
    })
    ->get();
0 голосов
/ 04 июня 2018

Сначала вы можете получить идентификатор, а затем выполнить запрос с фильтрами:

$status_id = Users::find($user_id)->statusCurrent()->id;

Теперь выполните фактический запрос, используя $status_id в whereHas предложении:

$users = Users::with('statusCurrent')
    ->whereHas('statusCurrent', function($query) use($status_id) {
        $query->where('status.status', 'In')
              ->where('id',$status_id);
    })->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...