Добавить параметр в красноречивую связь Laravel в функции «with»

#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. Кажется жизнеспособным решением, но если существует решение без повторения кода, это было бы еще лучше