У меня есть метод в моей модели User
, который должен возвращать все истекающие квалификации этого пользователя (чтобы иметь возможность предупредить об этом employers
).
Каждый Qualification
имеет поле days_before_warning
, в котором указывается сколько дней, прежде чем он истечет, об этом следует предупредить employers
.
Это мой метод:
return $this->qualifications()
->wherePivot('valid_until', '!=', null)
->wherePivot('valid_until', '<=', Carbon::today()->subDays('days_before_warning'))
->get();
Конечно, days_before_warning
так использовать нельзя.
Как я могу получить доступ к атрибуту days_before_warning
, чтобы сравнить его с атрибутом поворота valid_until
?
Думаю, вам нужна функция mysql DATE_SUB
. Что-то вроде:
return $this->qualifications()
->wherePivot('valid_until', '!=', null)
->wherePivot('valid_until', '<=', DB::raw('DATE_SUB(NOW(), INTERVAL days_before_warning DAYS')))
->get();
Вы можете создать собственную сводную модель и назначить для нее метод доступа get. Он избегает использования большего количества запросов, чем необходимо.
class QualificationsPivot extends Pivot{
public function getValidAttribute(){
return $this->attributes['valid_until'] <= $this->atttributes['days_before_warning']
}
}
Пока вы изменяете свой метод отношений в своей пользовательской модели, чтобы включить using ():
return $this->belongsToMany(Qualifications::class, 'qualifications_pivot_table_name', 'user_id', 'qualifications_id')
->using(QualificationsPivot::class)
->withPivot(['valid_until', 'days_before_warning']);
Это должно позволить вам вызвать:
$this->Qualifications->where('pivot.valid', true);
Чтобы получить все квалификации, в которых измененный действительный атрибут является истинным. Я не уверен, как выглядит ваш метод взаимоотношений, но предполагаю, что вы хотите загрузить квалификации с помощью метода with (). Я протестировал его на одной из моих моделей поворота, и, похоже, он работает нормально. Дайте мне знать, если у вас возникнут дополнительные вопросы. См. Некоторые ссылки ниже:
используя метод (): https://medium.com/@codebyjeff/custom-pivot-table-models-or-choosing-the-right-technique-in-laravel-fe435ce4e27e
Некоторый вопрос SO, который я обнаружил, может быть полезен для этого (мутаторы на моделях поворота): laravel / красноречивые мутаторы / аксессоры в сводной таблице
Обновлено: также наткнулся на это: https://laracasts.com/discuss/channels/eloquent/how-to-define-an-accessor-for-a-pivot-table-attribute?page=1
в нем говорится, что вы должны просто предоставить аксессор для родительской модели (пользователя). Я не тестировал его, но это может быть более простой вариант, если вам не нужны другие функции, которые поставляются с настраиваемой моделью поворота.