2016-06-10 124 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/)。 –

相关问题