#laravel #eloquent
#laravel #красноречивый
Вопрос:
Я хотел бы добавить параметр в мою Eloquent relationship в with::
статическом методе.
У меня есть модель дилера, которая имеет эти отношения
public function events()
{
return $this->hasMany('AppEvent', 'dealer_id', 'dealer_id');
}
public function recentEvents($interval = 14)
{
return $this->events()
->whereDate('datestart', '>=', Carbon::now('America/Toronto')->subDays($interval))
->whereDate('dateend', '>=', Carbon::now('America/Toronto'));
}
Все работает нормально, если я называю это так, $dealer->recentEvents(20)
но в моем DealerController
Я хотел бы сделать что-то в соответствии с этим
Dealer::with("recentEvents")
->where('dealer_flag', 1)
->orderBy('dealer_storename', 'ASC')
->get();
Где я бы передал paremeter в «recentEvents».
Я попытался использовать функцию закрытия with
следующим образом
Dealer::with(["recentEvents" => function ($query) use ($interval){
//The problem here is that I would need to put the recent-events code like this
$query->whereDate('cal_datestart', '>=', Carbon::now('America/Toronto')->subDays($interval))
->whereDate('cal_dateend', '>=', Carbon::now('America/Toronto'));
}])
->where('dealer_flag', 1)
->orderBy('dealer_storename', 'ASC')
->get();
Но это лишило бы цели создания recentEvents
отношений.
Возможно ли просто передать параметр?
Я пытался использовать динамическую область из Laravel doc, но я понял, что это не то, что я искал.
Ответ №1:
я думаю, что вам следует использовать так
Dealer::with(["events",function($q) use($interval){
$q->whereDate('datestart', '>=', Carbon::now('America/Toronto')->subDays($interval))
->whereDate('dateend', '>=', Carbon::now('America/Toronto'));
}])
->where('dealer_flag', 1)
->orderBy('dealer_storename', 'ASC')
->get();
Комментарии:
1. Кажется жизнеспособным решением, но если существует решение без повторения кода, это было бы еще лучше