Laravel сравнивает два атрибута из сводной таблицы - PullRequest
0 голосов
/ 25 октября 2018

В моей модели 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 pivot?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы можете создать собственную модель пивота и назначить для нее аксессор get.Он избегает использования большего количества запросов, чем нужно.

class QualificationsPivot extends Pivot{
    public function getValidAttribute(){
        return $this->attributes['valid_until'] <= $this->atttributes['days_before_warning'] 
    }
}

Пока вы изменяете метод отношений в вашей пользовательской модели, чтобы включить использование ():

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);

Чтобы получить все квалификации, в которых атрибут с мутировавшим атрибутом имеет значение true.Я не уверен, как выглядит ваш метод отношений, но я предполагаю, что вы стремитесь загрузить квалификации, используя метод with ().Я протестировал его на одной из моих моделей Pivot, и, похоже, он работает нормально.Дайте мне знать, если у вас есть дополнительные вопросы.См. Некоторые ссылки ниже:

с использованием метода (): https://medium.com/@codebyjeff/custom-pivot-table-models-or-choosing-the-right-technique-in-laravel-fe435ce4e27e

Некоторые вопросы SO, которые я обнаружил, которые могут быть полезны для этого (мутаторы на моделях сводной оси): мутанты laravel / eloquent/ accessors в сводной таблице

Редактировать: Также сталкивался с этим: https://laracasts.com/discuss/channels/eloquent/how-to-define-an-accessor-for-a-pivot-table-attribute?page=1

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

0 голосов
/ 25 октября 2018

Думаю, вам нужна функция mysql DATE_SUB.Что-то вроде:

return $this->qualifications()
  ->wherePivot('valid_until', '!=', null)
  ->wherePivot('valid_until', '<=', DB::raw('DATE_SUB(NOW(), INTERVAL days_before_warning DAYS')))
  ->get();
...