Laravel передает дополнительные параметры в has

Допустим, у меня есть отношения с такой моделью

public function currentInvoices($time = 'current'){
        switch ($time) {
            case 'current':
                $start = Carbon::create()->startOfMonth()->format('Y-m-d H:i:s');
                $end = Carbon::create()->endOfMonth()->format('Y-m-d H:i:s');
            break;
            case 'lastMonth':
                $start = Carbon::create()->subMonth()->startOfMonth()->format('Y-m-d H:i:s');
                $end = Carbon::create()->subMonth()->endOfMonth()->format('Y-m-d H:i:s');
            break;
            default:
                $start = Carbon::create()->startOfMonth()->format('Y-m-d H:i:s');
                $end = Carbon::create()->endOfMonth()->format('Y-m-d H:i:s');
        }

        return $this->hasManyThrough(
            'App\Models\Invoices',
            'App\Models\Tenancies\Tenancies',
            'linked_tenant_id', // Foreign key on Tenancies table...
            'tenant_id', // Foreign key on invoices table...
            'id', // Local key on tenants table...
            'id' // Local key on tenancies table...
        )->where('invoices.start_date','>=',$start)->where('invoices.end_date','<=',$end);
    }

Как передать аргумент при использовании красноречивых has. Например, вот чего я пытаюсь достичь

$tenantCompany = $tenantCompany->has('currentInvoices','lastMonth');

Можно ли передать второй аргумент в функцию eloquents has? Если нет предложений о том, как я могу этого добиться?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Можно использовать whereHas

$tenantCompany = $tenantCompany->whereHas('currentInvoices', function($query) use($start_date, $end_date {
    $query->where('start_date', '>=', $start_date)->where('end_date', '<=', $end_date);
})->get();

Подробнее о методах взаимоотношений: https://laravel.com/docs/5.6/eloquent-relationships

Спасибо за предложение, но это не совсем то, что я ищу. Я искал способ запустить оператор switch внутри моей модели, поэтому мне нужно иметь возможность вызвать красноречивую функцию has и передать ей аргумент.

S_R 09.08.2018 13:16

@S_R вы можете создать 2 отдельных отношения или 2 отдельных запроса. Но вы не должны передавать параметры своим отношениям. Это просто не так, как должно работать.

GONG 09.08.2018 13:19

@S_R ваш второй случай - использовать переменную внутри вашего класса. И создайте для него сеттер и просто все время его меняйте. Но похоже на плохое решение для меня

GONG 09.08.2018 13:22

Поскольку это не кажется достижимым способом, которым я хочу это сделать, я только что запустил whereHas в контроллере, как было предложено. Спасибо.

S_R 09.08.2018 13:46

Я предпочитаю делать это вот так

public function invoices(){
        return $this->hasManyThrough(
            'App\Models\Invoices',
            'App\Models\Tenancies\Tenancies',
            'linked_tenant_id', // Foreign key on Tenancies table...
            'tenant_id', // Foreign key on invoices table...
            'id', // Local key on tenants table...
            'id' // Local key on tenancies table...
        );
}

public function currentInvoices(){
    $start = Carbon::create()->startOfMonth()->format('Y-m-d H:i:s');
    $end = Carbon::create()->endOfMonth()->format('Y-m-d H:i:s');

    return $this->invoices()->where('invoices.start_date','>=',$start)
                            ->where('invoices.end_date','<=',$end);
}

public function lastMonthInvoices(){
    $start = Carbon::create()->subMonth()->startOfMonth()->format('Y-m-d H:i:s');
    $end = Carbon::create()->subMonth()->endOfMonth()->format('Y-m-d H:i:s');

    return $this->invoices()->where('invoices.start_date','>=',$start)
                            ->where('invoices.end_date','<=',$end);
}

Теперь возьми вот так

$tenantCompany = $tenantCompany->has('lastMonthInvoices');

Так я поступил изначально, но имя currentInvoices должно оставаться прежним для петли в лезвии. Спасибо за предложение.

S_R 09.08.2018 13:45

Другие вопросы по теме