Laravel `orWhereIn` заставляет` whereNotIn` не вступать в силу - PullRequest
0 голосов
/ 25 июня 2019

У меня запрос, который orWhereIn заставляет whereNotIn не вступить в силу, и я не получаю желаемого результата!столбцы этих двух элементов различаются.

Когда я меняю порядок этих фрагментов запросов, иногда он только повторяет последнюю строку, иногда последние 3, а иногда результат оказывается далеко от ожидания

$userposts = userPost::with([
    //RELATIONS--------------------------------------------------------------------------
    'getUser.userbaseinfo',
    'getUser.usercertinfo',
    'getUser.getJobexp',
    'getLike'                           => function ($q) {
        $q->where('liked', 1);
        $q->orderByRaw("FIELD(user_id ," . auth()->user()->id . ") DESC");
    },
    'getLike.getUser.Userbaseinfo',
    'getLike.usercertinfo.getmajor',
    'getLike.usercertinfo.getuniversity',
    'getLike.userjobexp.getCompany',
    'getLike.getcandidate',
    'getLike.userbaseinfo',
    'gettags',
    'getCandidate.getBaseinfo',
    'getCandidate.getCertificate.getmajor',
    'getCandidate.getCertificate.getuniversity',
    'getCandidate.candidjobexp.getCompany',
    'getComments'                       => function ($q) {
        $q->orderByRaw("FIELD(user_id ," . auth()->user()->id . ") DESC");
    },
    'getComments.userbaseinfo',
    'getComments.getcandidate',
    'getComments.usercertinfo.getmajor',
    'getComments.usercertinfo.getuniversity',
    'getComments.userjobexp.getCompany',
    'getfriendreq'                      => function ($q) {
        $q->where('requester_id', auth()->user()->id);
    },
    'getfollow'                         => function ($q) {
        $q->where('req_id', auth()->user()->id);
    },
    'getComments.getLike'               => function ($q) {
        $q->orderByRaw("FIELD(user_id ," . auth()->user()->id . ") DESC");
        $q->where('liked', 1);
    },
    'getComments.getLike.getcandidate',
    'getComments.getLike.getuser',
    'getComments.getLike.Userbaseinfo',
    'getComments.getLike.usercertinfo',
    'getComments.getLike.Userjobexp'    => function ($q) {
        $q->limit(1);
    },
    'getsharedpost.getUser.userbaseinfo',
    'getsharedpost.getUser.usercertinfo',
    'getsharedpost.getUser.getJobexp',
    'getsharedpost.getCandidate',
    'getComments.childcomments'         => function ($q) {
        $q->orderByRaw("FIELD(user_id ," . auth()->user()->id . ") DESC");
    },
    'getComments.childcomments.userjobexp',
    'getComments.childcomments.getcandidate',
    'getComments.childcomments.usercertinfo',
    'getComments.childcomments.userbaseinfo',
    'getComments.childcomments.getLike' => function ($q) {
        $q->orderByRaw("FIELD(user_id ," . auth()->user()->id . ") DESC");
        $q->where('liked', 1);
    },
    'getComments.childcomments.getLike.getuser',
    'getComments.childcomments.getLike.userjobexp',
    'getComments.childcomments.getLike.getcandidate',
    'getComments.childcomments.getLike.usercertinfo',
    'getComments.childcomments.getLike.userbaseinfo'])
    //END OF RELATION----------------------------------------------------------------

    //If I change these query piece order the result might be changed
    ->whereHas('gettags', function ($q) use ($TagsToLook) {
        $q->whereIn('tag_id', $TagsToLook);
    });

$userposts = $userposts->orWhereIn('user_id', $Sourceloader)->where('user_id', auth()->user()->id);

if (count($lastpostid) > 0) {
    $userposts = $userposts->whereNotIn('post_id', $lastpostid);
}

$result = $userposts->orderBy('created_at', 'desc')->limit(3)->get();

Желаемый результат: отображение сообщений с отношениями, которые не были показаны Where это не зарегистрированный пользователь orWhere user_id равен $ sourceloader.

Фактический результат: если сообщения находятся в whereNotIn ($ lastpostid) от пользователей, что их идентификатор находится в $ sourceloader, тогда whereNotIn не вступит в силу, и он будет продолжать показывать предыдущие сообщения.

1 Ответ

1 голос
/ 25 июня 2019

Похоже, что вы хотите получить результаты, где либо tag_id находится в данном наборе, либо user_id находится в заданном наборе, при условии, что в любом случае post_id не находится в данном наборе , В этом случае вам нужно сгруппировать условия tag_id и user_id.

->where(function($query) use ($TagsToLook) {
  return $query
    ->whereHas('gettags', function ($q) use ($TagsToLook) {
      $q->whereIn('tag_id', $TagsToLook);
    })
    ->orWhereIn('user_id', $Sourceloader);
});

Это эквивалентно размещению их в скобках в необработанном SQL. Вы можете прочитать об этом здесь в разделе «Цепочки или разделы после отношений».

...