2016-06-10 173 views
2

我有一個事件表,包含4個事件,所有事件都有不同的開始日期和結束日期。Eloquent:檢查日期是否在開始日期和結束日期之間

mysql> select id, event_name, event_startdate, event_closedate from events; 
+----+--------------+---------------------+---------------------------+ 
| id | event_name | event_startdate  | event_closedate   | 
+----+--------------+---------------------+---------------------------+ 
| 1 | Event 1  | 2016-05-01 00:00:00 | 2016-06-30 00:00:00  | 
| 2 | Event 2  | 2016-06-01 00:00:00 | 2016-07-30 00:00:00  | 
| 3 | Event 3  | 2016-07-01 00:00:00 | 2016-08-30 00:00:00  | 
| 4 | Event 4  | 2016-09-01 00:00:00 | 2016-10-30 00:00:00  | 
+----+--------------+---------------------+---------------------------+ 

我想返回當前事件。在MySQL中,以下查詢的工作原理如下:

mysql> select id, event_name, event_startdate, event_closedate from events where now() >= event_startdate and now() <= event_closedate; 
+----+--------------+---------------------+---------------------------+ 
| id | event_name | event_startdate  | event_closedate   | 
+----+--------------+---------------------+---------------------------+ 
| 1 | Event 1  | 2016-05-01 00:00:00 | 2016-06-30 00:00:00  | 
| 2 | Event 2  | 2016-06-01 00:00:00 | 2016-07-30 00:00:00  | 
+----+--------------+---------------------+---------------------------+ 

現在,我想創建等效的Eloquent。我創建了以下內容:

$current_events = DB::table('events')->select('id','event_name', 'event_startdate', 'event_closedate')->where(DB::raw('now()'), '>=', 'event_startdate')->where(DB::raw('now()'), '<=', 'event_closedate')->get(); 

當我在Laravel一個「DD」輸出,我得到:

"select `id`, `event_name`, `event_startdate`, `event_closedate` from `events` where now() >= ? and now() <= ?" 

以上是相當類似的MySQL返回兩個時事查詢,所以我期待看到在我看來,兩個事件,但沒有被輸出,所以我懷疑我做錯了

的觀點是:

@foreach($current_events as $event) 
<tr> 
    <td align="center" class="hidden-xs">{{ $event->id }}</td> 
    <td>{{ $event->event_name }}</td> 
    <td>{{ $event->event_startdate }}</td> 
    <td>{{ $event->event_closedate) }}</td> 
</tr> 
@endforeach 

任何原因爲什麼這不會返回兩個時事?

+0

這兩個查詢完全一樣,據我所見。你爲什麼不'dd($ current_events)'看看你得到了什麼。也許你認爲代碼是問題,而不是查詢。 – haakym

+0

我做了一個dd($ current_events),它在原始問題中。兩者的確如此。 – wiwa1978

+0

對不起,如果我不清楚。我不告訴你轉儲查詢,即' - > toSql'。我告訴你轉儲查詢的值,即' - > get()' – haakym

回答

2

你嘗試

$current_events = DB::table('events')->select('id','event_name', 'event_startdate', 'event_closedate') 
    ->where(DB::raw('now()'), '>=', DB::raw('event_startdate')) 
    ->where(DB::raw('now()'), '<=', DB::raw('event_closedate'))->get(); 
+0

謝謝。數據庫:日期列的原始確實是訣竅。我相信這是一種奇怪的行爲,但它有效。我在下面添加了答案。 – wiwa1978

0

正確的查詢使用的是:

$current_events = DB::table('events')->select('id','event_name', 'event_startdate', 'event_closedate') 
    ->where(DB::raw('now()'), '>=', DB::raw('event_startdate')) 
    ->where(DB::raw('now()'), '<=', DB::raw('event_closedate'))->get(); 

,而不是

$current_events = DB::table('events')->select('id','event_name', 'event_startdate', 'event_closedate') 
    ->where(DB::raw('now()'), '>=', 'event_startdate') 
    ->where(DB::raw('now()'), '<=', 'event_closedate')->get(); 
1

這將是更好,如果你使用query scopes你的口才模型中,範圍使您的代碼更容易理解,並且比您的案例中的原始查詢更好地工作。例如,在你的模型,你應該做的:

class Event extends Model 
{ 

    ... 

    public function scopeCurrent($query) 
    { 
     return $query->where('event_startdate', '<=', Carbon\Carbon::now()) 
      ->where('event_closedate', '>=', Carbon\Carbon::now()); 
    } 

    ... 

} 

,隨時隨地在你的控制器:

class EventController extends Controller 
{ 
    /** 
    * Display a listing of the resource. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    public function index(Request $request) 
    { 
     $todayEvents = Event::current()->select('id', 'event_name', 'event_startdate', 'event_closedate')->get(); 

     ... 
    } 
} 

如果您遇到與碳的問題,檢查docs

+0

謝謝,我一定會看看。所以Event :: current()自動映射到模型中的scopeCurrent(),是嗎? – wiwa1978

+0

你說得對,範圍是預定義的過濾模型的查詢條件。你也可以定義動態範圍,看看[這裏](http://www.easylaravelbook.com/blog/2015/06/23/using-scopes-with-laravel-5/)。 –

相關問題