2017-05-28 18 views
1

私はイベントを表すテーブルを持っています。イベントの24時間前までは予約できません。LaravelどこでCarbon addMinutesが動作しないのですか?

私はこのための '予約可能な'スコープを作成しようとしていますが、失敗しています。具体的には、「時間」はイベントの時刻(タイムスタンプ)を表し、「通知」はイベントモデルの列である通知期間(分)(整数)を表します。私が見つけたのは、Laravelが「通知」変数を読んでいない、つまり0として扱っているということです。どんな指針もありがとうございます。ありがとうございます。

public function scopeBookable($q) { 
    $q->where('time','>',Carbon::now()->addMinutes('notice'))->orderBy('time','ASC')->get(); 
} 

答えて

4

addMinutes()メソッドでは、文字列ではない整数が必要です。あなたがスコープに至る予告時間を渡すことができ

スコープオプション

// Controller 
$notice = 60; 
Events::bookable($notice); 

// Model 
public function scopeBookable($q, $notice=0) { 
    $q->where('time','>',Carbon::now()->addMinutes($notice))->orderBy('time','ASC')-get(); 
} 

あなたは常に自己結合SQLで実行し、サブクエリでnoticeの値を確認することができますコレクションオプション

。もう一つの選択肢は、フィルタリングされた雄弁なコレクションを返すことです。

public function scopeBookable() { 
    return Events::all()->filter(function($event) { 
     return $event->time > Carbon::now()->addMinutes($event->notice) 
    }); 
} 
+0

「通知」列は実際には整数です。例えば。 addMinutesを 'notice'がある場所で使用すると、それは 'notice'変数を適切に選択しないqueryScopeの一部である何らかの理由によるものです。 – user6122500

+0

@ user6122500そうかもしれませんが、CabonはDB列について何も知らないのです。 –

+0

ありがとうございます。しかし、「通知」はイベントによって実際に変わる変数です。例えば。イベントAには10分の通知があり、イベントBには60分かかることがあります。どうすればそれに対応できますか? (クエリスコープ内でwhere節の 'notice'が関数にラップされると、正しく認識されなくなっているように思えます) – user6122500

関連する問題