Спасибо, ребята, за ваши быстрые ответы.Я понял это, используя другой подход, основанный на ваших идеях.Поскольку я не могу использовать вычисляемые поля в запросе, я вернулся к полю, которое действительно существует в БД, это renewalDueDate, то есть год с даты платежа;обе известные и фиксированные даты.Затем в запросе я передаю $ user и $ dateToCheck в качестве параметров, вычитая оставшиеся дни друзей и сравниваю их с этим значением, например:
public function scopeActive($query, $user, $dateToCheck = Null) {
// If no date is passed, use today()
$dateToCheck = is_null($dateToCheck) ? Carbon::today() : Carbon::parse($dateToCheck);
//Substract the friendsDaysRemaining from the dateToCheck
$AdjustedEndDate = $DateToCheck->copy()->subDays($user->friendsDaysRemaining);
//Build the query
$query ->where('paid', 1) //its been paid for
->where('startDay', '<=', $DateToCheck) //It has started
->where('renewalDueDate', '>=', $AdjustedEndDate); //It has not expired
return $query;
}
Несмотря на то, что передавать пользователяполучить оставшиеся дни друзей, теперь это работает нормально:
$dateToCheck= '2018-09-01';
dump($user->membership()->active($user, $dateToCheck)->pluck('id'));
Результат:
Коллекция {# 299 ▼ # элементов: массив: 2 [▼ 0 => 83 1=> 6]}
Конечно, вы также можете передать $ friendsDaysRemaining вместо $ user, но это также далеко от элегантности.
Еще раз спасибо.