所以我有2个模型,User
和Website
。
我也在使用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
有一个有效的订阅。
我真的不知道采用雄辩的方法来实现这一目标。我尝试的任何方式都会变得过于混乱。
答案 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的范围。