2013-08-05 73 views
0

我有以下設置:過濾渴望加載數據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'); 
} 

因此,例如Club Foo可能會有一個名爲「Triathlon」的活動,該Activity具有ActivityTypes「游泳」,「跑步」和「自行車」。

這已經夠用了,但我需要在Club頁面上顯示ActivityTypes列表 - 基本上只是一個列表。所以我需要獲取所有相關活動的ActivityTypes。

我能做到這一點,像這樣從接收的俱樂部模型的實例的控制方法:

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

這讓我與有關他們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

謝謝 - 我採用了不同的答案,因爲您建議的方法意味着我只能通過activities()模型方法檢索活動活動。使用過濾器意味着我還可以獲得狀態爲「掛起」或其他任何狀態的人。 –