Допустим, у меня есть отношения с такой моделью
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
? Если нет предложений о том, как я могу этого добиться?
Можно использовать 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
@S_R вы можете создать 2 отдельных отношения или 2 отдельных запроса. Но вы не должны передавать параметры своим отношениям. Это просто не так, как должно работать.
@S_R ваш второй случай - использовать переменную внутри вашего класса. И создайте для него сеттер и просто все время его меняйте. Но похоже на плохое решение для меня
Поскольку это не кажется достижимым способом, которым я хочу это сделать, я только что запустил whereHas в контроллере, как было предложено. Спасибо.
Я предпочитаю делать это вот так
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
должно оставаться прежним для петли в лезвии. Спасибо за предложение.
Спасибо за предложение, но это не совсем то, что я ищу. Я искал способ запустить оператор switch внутри моей модели, поэтому мне нужно иметь возможность вызвать красноречивую функцию
has
и передать ей аргумент.