2013-08-05 3 views
0

У меня есть следующие настройки:Фильтрующие рвутся загруженным данные в Laravel 4

клубы предлагают развлечения, которые имеют определенного типа, поэтому 3 модели с отношениями:

клуб:

function activities() 
{ 
    return $this->hasMany('Activity'); 
} 

активность:

function club() 
{ 
    return $this->belongsTo('Club'); 
} 

function activityType() 
{ 
    return $this->hasMany('ActivityType'); 
} 

ActivityType:

function activities() 
{ 
    return $this->belongsToMany('Activity'); 
} 

Так, например, в клубе Foo может быть одно мероприятие под названием «Триатлон», и эта активность имеет активность «Плавание», «Бег» и «Велоспорт».

Это все достаточно справедливо, но мне нужно показать список ActivityTypes на странице Клуба - в основном просто список. Поэтому мне нужно получить ActivityTypes всех связанных действий.

я могу сделать это как так из метода контроллера, который получает экземпляр модели клуба:

$data = $this->club->with(array('activities', 'activities.activityTypes'))->find($club->id) 

Это заставляет меня объект со всей относящейся к деятельности наряду с ActivityTypes, связанной с ними. Также справедливо. Но мне нужно применить еще одну фильтрацию. Активность может быть не в правильном состоянии (она может быть в БД как черновик или истек), поэтому мне нужно иметь возможность получать только ActivityTypes из Деяний, которые являются живыми и в будущем.

На данный момент я потерян ... у кого-нибудь есть предложения по обработке этого прецедента?

Благодаря

ответ

1

Для фильтрации можно использовать where() как в плавных запросов БД:

$data = Club::with(array('activities' => function($query) 
{ 
    $query->where('activity_start', '>', DB::raw('current_time')); 

}))->activityType()->get(); 

В примере, который послужил основой для этого является в Laravel документации, проверить конец этого раздела : http://laravel.com/docs/eloquent#eager-loading

(код не испытан, и я предпринял некоторые вольности с именами свойств! :))

0

Я думаю, что если вы сначала ограничиваете свои отношения деятельностью, связанные с ними виды деятельности также будут автоматически ограничены.

Так что я хотел бы сделать это

function activities() 
{ 
    return $this->belongsToMany('Activity')->where('status', '=', 'active'); 
} 

, а затем ваш

$data = $this->club->with(array('activities', 'activities.activityTypes'))->find($club->id)` 

запрос будет работать, как и следовало ожидать.

+0

Спасибо - я пошел с другим ответом, поскольку предложенный вами подход означал бы, что я мог бы только когда-либо извлекать активные действия с помощью метода activity(). Используя фильтр, я также могу получить те, у кого есть статус «ожидающий» или что-то еще. –

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