или Где отменил мое другое условие Где - PullRequest
0 голосов
/ 21 мая 2019

Итак, я пытаюсь сделать запрос, отфильтрованный по диапазону дат.Проблема в том, что мне нужно выполнить запрос orWhereHas, который в настоящее время не подчиняется моему запросу whereBetween.

Так что у меня есть 2 таблицы Promos и Member_Promo.Чтобы получить предстоящие промо-акции для пользователя, я использую функцию типа Auth::user()->upcomingPromos('ytd').Функция выглядит следующим образом:

public function upcomingPromos($type)
    {
        switch ($type) {
            case 'ytd':
                $range = [Carbon::today(), Carbon::now()->endOfYear()];
                break;

            case 'mtd':
                $range = [Carbon::today(), Carbon::now()->endOfMonth()];
                break;
        }


        return Promo::where('owner_id', $this->id)
            ->whereBetween('date', $range)
            ->orWhereHas('members', function ($query) {
                $query->where('user_id', $this->id);
            })
            ->oldest('date')
            ->get();
    }

Я хочу, чтобы конечным результатом были все промо-акции между диапазонами дат, в которых пользователь является либо:

  • a.) Владельцем (промо-таблица с owner_id)
  • b.) участник (таблица members_promo с user_id).

    Таким образом, список будет содержать все промо-акции, в которые они входят, в диапазоне дат.

В промо-таблице есть owner_id и date I поиск по.Таблица members_promo - это просто стержень с user_id и promo_id.Проблема связана с тем, что orWhereHas не ограничивает этот запрос диапазоном дат.Поэтому, если пользователь является участником акции, которая не входит в этот диапазон, он все равно возвращается, когда не должен.

1 Ответ

0 голосов
/ 21 мая 2019

Замена get() на toSql() действительно удобна для отладки такого рода проблем с запросами - она ​​покажет вам SQL, который обрабатывается и обрабатывается вызовами вашего построителя запросов.

В вашем случае,сворачивание двух параметров, которые вы хотите OR, в where(function($query) { }) делает свое дело.Под этим скрывается два условия в боковых скобках в результирующем запросе.

return Promo::where('owner_id', $this->id)
    ->where(function($q) use ($range) {
        $q->whereBetween('date', $range)
            ->orWhereHas('members', function ($query) {
                $query->where('user_id', $this->id);
            });
    })
    ->oldest('date')
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...