具有用户关系的Laravel范围来检查订阅

时间:2016-03-24 02:57:03

标签: laravel scope eloquent

所以我有2个模型,UserWebsite

我也在使用Laravel收银台,它使用条带进行订阅。

关系User模型:

public function websites() {
    return $this->hasMany('App\Models\Website');
}

Website模型中的关系:

public function user() {
    return $this->belongsTo('App\User');
}

同样在我的Website模型中:

public function scopeNeedsUpdate($query) {
    $query->whereRaw('last_queued <= DATE_SUB(NOW(), INTERVAL 12 HOUR)')->orderBy('created_at', 'desc');
}

范围是我获取需要排队的网站的地方。但是,我需要添加一个条件,它只返回一个网站last_queued&lt; = 12小时且相关的User有一个有效的订阅。

我真的不知道采用雄辩的方法来实现这一目标。我尝试的任何方式都会变得过于混乱。

1 个答案:

答案 0 :(得分:3)

为了检查是否存在与某些自定义属性的关系,您可以constrain your eager load使用闭包。当您想要检查具有活动Stripe订阅的用户时,将该逻辑移动到User模型的作用域然后引用闭包中的作用域是最简洁的:

用户模型:

public function scopeSubscribed($query) {
    return $query->where('stripe_active', 1)
                 ->where(function($q) {
                     $q->where('subscription_ends_at', null)
                       ->orWhere('subscription_ends_at', '>', DB::raw('NOW()'));
                 });
}

这意味着您现在可以进行干净的查询。

Website::whereHas('user', function($query){
    $query->subscribed();
})->needsUpdate()->get();

请注意,这适用于Laravel 5.0。收银员自那时起发生了很大的变化,this thread有一个很好的解决方案,可以将subscribed变成5.2的范围。