2016-03-24 2 views
2

Итак, у меня есть 2 модели, User и Website.Laravel scope с пользовательским отношением для проверки подписки

Я также использую кассир 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. < = 12 часов. Соответствующая User имеет активную подписку.

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

ответ

3

Чтобы проверить наличие отношений с некоторыми пользовательскими атрибутами, вы можете constrain your eager load с закрытием. Как вы хотите проверить, для пользователей с активной подпиской полоски, было бы чистым, чтобы переместить эту логику в рамки вашей модели пользователя, а затем ссылаться на сферу замыканию:

Модель пользователя:

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.

+0

Это немного больше, чем проверка того, активен ли статус, или '1', как хранит его Laravel. Он также имеет 'subscription_ends_at', который должен быть либо« null », либо дата, которая не прошла. (Льготный период). У Laravel есть метод '$ user-> signed()', который возвращает 'true' или' false', поэтому я надеялся, что смогу использовать это прямо так или иначе? – zen

+0

@zen Я раньше не использовал Кассир, но теперь просматриваю документы и вижу, какие типы таблиц базы данных ему требуются. Не совсем понятно, что вы хотите. Насколько мне известно, вы хотите получить список сайтов с полем «last_queued» с временной отметкой за последние 12 часов и принадлежащими к активным пользователям, которые подписались на * ваш сайт * и чьи подписки активны ('subscription_ends_at' имеет значение null или дата, которая еще не прошла)? –

+0

да это в значительной степени. Я использую Laravel 5.0, и я считаю, что кассир изменился после 5.1. Те условия, которые вы описали, верны. Я просто сказал, что, вероятно, будет проще использовать метод '$ user-> signed()', поскольку он автоматически проверяет вас. – zen

Смежные вопросы