Laravel — Где запрос не возвращает правильные записи

#laravel #eloquent #many-to-many #pivot-table

Вопрос:

В настоящее время я пишу поисковый запрос, но у меня возникли проблемы с соединением a where с a whereHas

если я хочу искать только по категориям..

Приведенный ниже запрос работает, если я просто ищу категории в одиночку

  $goals = $myGoals
        ->whereHas('categories', function ($q) use ($search) {
            $q->where('name', 'like', "%$search%");
        })->paginate(10);
 

если я хочу искать только название..

То же, что и выше, если я хочу найти название целей соло

 $goals = $myGoals->where('title', 'like', "%$search%" )->paginate(10);
 

оба запроса работают, если я хочу искать их по отдельности.

Попытка запроса

Ниже приведен запрос, который я написал, чтобы позволить пользователю искать title цель и цель name category .

  $myGoals = $team->goals();

    $goals = $myGoals
        ->whereHas('categories', function ($q) use ($search) {
            $q->where('name', 'like', "%$search%");
        })->where('title', 'like', "%$search%" )->paginate(10);
 

Я попробовал выполнить вышеприведенный запрос, но результаты поиска возвращаются пустыми, когда я ввожу ввод. Я также попытался поменять where() orWhere() местами значение, которое затем возвращает цель, которая не принадлежит $team экземпляру модели, но является записью цели, ссылающейся на другую Team модель id в сводной таблице.

Может ли кто-нибудь определить, где я иду не так? Спасибо

Ответ №1:

Вам нужно использовать все это внутри, где.

 $goals = $myGoals->where(function ($query) use ($search){
                return $query->whereHas('categories', function ($q) use ($search) {
                    $q->where('name', 'like', "%$search%");
                })->orWhere('title', 'like', "%$search%" );
                })->paginate(10);
 

Комментарии:

1. это сработало как заклинание! спасибо, чувак. Можете ли вы объяснить, почему вверху требуется функция where ()?

2. Потому что orWhere() вмешивается в другие условия на том же уровне. Вот почему мы перевели его на другой уровень состояния. Так что это работает только с условием whereHas(«категории»)….

3. В этом есть смысл, спасибо за объяснение