Laravel — ограничить запрос через отношения?

#php #laravel #laravel-4

#php #laravel #laravel-4

Вопрос:

Я бился головой об стену с этим, поэтому мне нужна небольшая помощь. Я использую Laravel 4.2.4. У меня есть две модели: Event и EventDate.

 // Event has id, name
class Event extends Eloquent
{
    protected $table = 'events';
    protected $guarded = ['id'];
    public $timestamps = false;

    public function eventdates()
    {
        return $this->hasMany('EventDate', 'event_id', 'id');
    }
}

// EventDate has id, event_id, start_date, end_date
class EventDate extends Eloquent
{
    protected $table = 'eventdates';
    protected $guarded = ['id'];
    public $timestamps = false;
}
  

Теперь я пытаюсь получить события между определенной начальной и конечной датой. Итак, согласно документам, я должен быть в состоянии сделать:

 Event::with('eventdates')->where('start_date', '>=', '2014-01-01')->where('end_date', '<=', '2014-02-01')->get();
  

Но все, что это делает, это выдает SQLSTATE[42S22]: Column not found: 1054 Unknown Column 'eventdates.start_date' in 'where clause' .

Я также пробовал использовать замыкания (при использовании шаблона репозитория), такие как:

 return $this->model->with(['eventdates' => function($query) use ($startDate, $endDate) {
    $query->where('start_date', '<=', $endDate->format('Y-m-d'));
    $query->where('end_date', '>=', $startDate->format('Y-m-d'));
}]);
  

Это похоже на действительно глупую ошибку, но я не могу ее понять. Есть идеи?

Ответ №1:

Вы можете попробовать это:

 $events = Event::with(array('eventdates' => function($query){
    // Querying in the eventdates table
    $query->where('start_date', '>=', '2014-01-01')
          ->where('end_date', '<=', '2014-02-01');
}))->get();
  

Это потому start_date end_date , что в таблице доступны поля and eventdates .

Комментарии:

1. Выполнение этого возвращает полный набор данных. У меня открыт профилировщик, и он показывает: select * from eventdates where eventdates.event_id in (ALL THE EVENT IDS) and start_date >= '2014-01-01' and end_date <= '2014-02-01' Но это не фактический выполняемый запрос. Или, возможно, это так, но Laravel не дает мне правильного ответа. Если я это сделаю echo $events->count() , это даст мне общее количество результатов. Выполнение этого запроса прямо в БД возвращает правильные результаты, поэтому я не уверен, что происходит.

Ответ №2:

Я могу более или менее ответить на этот вопрос. Я добился большего успеха, используя whereHas:

 return $this->model->whereHas('eventdates', function($query) use ($startDate, $endDate) {
    $query->where('start_date', '<=', $endDate->format('Y-m-d'));
    $query->where('end_date', '>=', $startDate->format('Y-m-d'));
})
->with('eventdates');
  

Спасибо всем.