2016-06-10 2 views
2

У меня есть таблица событий с 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  | 
+----+--------------+---------------------+---------------------------+ 

Теперь, я хочу создать Красноречивый эквивалент. Я создал следующее:

$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, я получаю:

"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

Спасибо. DB: raw для столбцов даты действительно сделал трюк. Я считаю, что это странное поведение, но оно работает. Я добавил ответ ниже. – 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(); 

     ... 
    } 
} 

Если у вас возникли проблемы с Carbon, проверьте docs.

+0

Спасибо, я обязательно посмотрю. Итак, Event :: current() автоматически отображает scopeCurrent() в модели, верно? – wiwa1978

+0

Вы правы, области - это предварительно заданные условия запроса для фильтрации модели. Вы также можете определить динамические области, посмотрите [здесь] (http://www.easylaravelbook.com/blog/2015/06/23/using-scopes-with-laravel-5/). –

Смежные вопросы

 Смежные вопросы