Всегда полезно смотреть на эти проблемы с разных точек зрения. Как упоминалось в двух комментариях, вы можете использовать Планирование заданий В windows или задания cron в linux системах. Следующий вариант - создать еще одно поле в вашей сводной области, которое будет похоже на «активное». Так что это будет логическое значение и всегда будет возвращать true или false. Теперь вы можете комбинировать планирование задач и использовать собственную команду ремесленника, вы можете продолжать проверять, истек ли срок действия спонсора, и, если он истек, установите для активного поля значение false. И в довершение всего, когда вы получите свои данные, просто отфильтруйте свой запрос. Я не знаю, как выглядит ваш код, но вот пример кода сводной таблицы и как я бы отфильтровал его (не проверял):
//Here active null assumes it is false value. Active 1 assumes it is true. So the active field will be nullable
$myQuery = Sponsor::with([‘apartments’ => function($q) {
$q->where(‘active’, null)->get();
}])->get();
//The apartments is assumed to be the pivot relationship in your sponspor model
Это всего лишь простой пример того, как вы могли бы цепочки и запрашивать отношения, будь то сводная таблица или любая другая таблица, вы можете выполнять пользовательские запросы в рамках, как указано выше. Что-то вроде этого должно работать в вашем случае