Laravel比较数据透视表中的两个属性

时间:2018-10-25 14:10:21

标签: php laravel eloquent laravel-query-builder

我的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数据透视表属性进行比较?

2 个答案:

答案 0 :(得分:0)

我认为您需要mysql DATE_SUB函数。像这样:

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

答案 1 :(得分:0)

您可以创建一个自定义枢轴模型并为此指定一个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);

获取所有有效条件为mutated的资格。我不确定您的关系方法是什么样子,但是我假设您渴望使用with()方法加载资格。我在其中一种枢轴模型上对其进行了测试,并且看起来工作正常。如果您还有其他问题,请告诉我。请参阅下面的一些参考:

using()方法: https://medium.com/@codebyjeff/custom-pivot-table-models-or-choosing-the-right-technique-in-laravel-fe435ce4e27e

我发现一些这样的问题可能对此有用(数据透视模型上的变量): laravel/eloquent mutators/accessors in a pivot table

编辑:也遇到了这个问题:https://laracasts.com/discuss/channels/eloquent/how-to-define-an-accessor-for-a-pivot-table-attribute?page=1

它指出您应该只能够在父模型(用户)上提供访问器。虽然我尚未对其进行测试,但是如果您不需要自定义数据透视模型附带的其他功能,则它可能是一个更简单的选择。