Laravel сравнивает два атрибута из сводной таблицы

У меня есть метод в моей модели 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?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
352
2

Ответы 2

Думаю, вам нужна функция 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

в нем говорится, что вы должны просто предоставить аксессор для родительской модели (пользователя). Я не тестировал его, но это может быть более простой вариант, если вам не нужны другие функции, которые поставляются с настраиваемой моделью поворота.

Другие вопросы по теме