Eloquent:检查日期是否在开始日期和结束日期之间

时间:2016-06-10 10:14:50

标签: laravel eloquent

我有一个包含4个事件的事件表,所有事件都有不同的开始和结束日期。

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();

当我做一个&#39; dd&#39; Laravel的输出,我得到:

"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

为什么这不会返回两个当前事件?

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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

答案 2 :(得分: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();

答案 3 :(得分:0)

因为 Laravel 使用碳日期..这是一个更好的解决方案。它还使用 Eloquent 模型,而不是 DB 类。

$current_event = Events::select( 'id','event_name', 'event_startdate', 'event_closedate' )
->where('event_startdate', '<=', Carbon::now())
->where('event_closedate', '>=', Carbon::now())->get();