我有一个包含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
为什么这不会返回两个当前事件?
答案 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();