#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');
Спасибо всем.