2016-03-24 23 views
2

したがって、UserWebsiteという2つのモデルがあります。Laravelスコープとサブスクリプション確認サブスクリプション

私はまた、購読のためにストライプを使用するLaravelレジ係を使用しています。私Websiteモデルで

public function websites() { 
    return $this->hasMany('App\Models\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'); 
} 

スコープがある私のUserモデルが

関係キューに入れる必要があります。しかし、私はそれがウェブサイトlast_queuedを返すだけの条件を追加する必要があります< = 12時間と関連するUserは、アクティブなサブスクリプションを持っています。

私は雄弁にそれをするための最善の方法を本当に知っていません。私はそれを試みるどんなやり方もあまりにも面倒で終わる。

答えて

3

カスタム属性との関係が存在するかどうかを確認するには、クロージャーを使用してconstrain your eager loadとすることができます。あなたがアクティブなストライプのサブスクリプションを持つユーザーをチェックすると、それはあなたの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は012のための良い解決策を持っています。subscribed

+0

ステータスがアクティブであるかどうかをチェックするだけで、Laravelがステータスを保存しているので「1」になります。 'subscription_ends_at'も' null'または渡されていない日付でなければなりません。 (猶予期間)。 Laravelには、 'true 'または' false'を返す '$ user-> subscribed()'メソッドがあるので、私は直接何とかそれを使用できることを望んでいましたか? – zen

+0

@zen私は以前はキャッシャーを使用していませんでしたが、今はドキュメントを調べて、必要なデータベーステーブルのタイプを見ています。あなたが望むものは完全にはっきりしていません。私の知る限りでは、最後の12時間のタイムスタンプを持ち、あなたのサイト*に登録されているアクティブなユーザに属し、そのサブスクリプションがアクティブである(last_queuedフィールドを持つウェブサイトのリストが必要ですか? 'subscription_ends_at'はnullか、まだ渡されていない日付ですか?) –

+0

それはかなりそうです。私はLaravel 5.0を使用しています。私は、現金計算機が5.1以降に変更されたと考えています。あなたが説明した条件は正しいです。私は '$ user-> subscribed()'メソッドを利用する方が簡単だと言っていました。すべてのチェックが自動的に行われるからです。 – zen

関連する問題