2014-03-27 111 views
2

我想返回一個Laravel集合對象的關係,其中得到的集合是基於嵌套標準(即嵌套模型的字段值)。因此,這將是這個樣子:Laravel集合渴望加載基於嵌套關係字段值

用戶 - >類別 - >發表 - >評論哪裏comment.active == 1

在這種情況下,我想要的結果,包括所有的特定用戶的categories => posts => comments,評論處於活動狀態。如果它處於活動狀態,它將嵌套在適當的層次結構中(Category->Post->Comment)。如果評論不活躍,則任何相關的帖子和​​潛在類別(如果沒有其他活動評論的帖子)都不應該顯示在該集合中。

我試過急於通過with(),load()filter()加載沒有運氣。他們將繼續加載與空評論關係的關係。尋找有關研究的指導:加入?過濾器?先進的雞蛋嵌套?


一個嘗試:

$user->categories->filter(function($category) { 
    return $category->isActive(); 
}); 

在我的模型我所有的關係設置適當的,而且除了我所建立isActive()如下:

// Category model 

public function isActive() { 

    $active = $this->posts->filter(function($post) { 
     return $post->isActive(); 
    } 

} 

// Post model 

public function isActive() { 

    return (boolean) $this->comments()->where('active', 1)->count(); 

} 

這按預期工作,但它還包括急切加載的嵌套關係,其中註釋的有效字段爲0.顯然,我以錯誤的方式執行此操作,但會欣賞任何方向。


的另一種嘗試:

User::with(['categories.posts.comments' => function($q) { 
    $q->where('active', 1); 
}])->find(1); 

不幸的是,這還加載有沒有活動的意見的關係(類別和職位)。用'categories.posts.isActive'取代關係也無效。

+0

沒有任何代碼,沒有人可以指導你,發佈相關的型號代碼。 –

回答

2

仍撲朔迷離,因爲你沒有提供足夠的代碼,但你可以嘗試這樣的事情讓所有嵌套categories.posts.comments的用戶,無需任何條件:

$users = User::with('categories.posts.comments')->get(); 

但它甚至會在給你的每一件事你沒有任何評論,但補充條件,你可以嘗試這樣的事:

// It should return all user models with `categories - posts - active comments` 
$users = User::with('categories.posts.activeComments')->get(); 

Post型號:

public function activeComments() { 
    return $this->hasMany('Comment')->where('active', 1); 
} 

您也可以增加使用限制更多的過濾器,如:

$users = User::with(array('categories.posts.activeComments' => function($query){ 
    $query->whereNull('comments.deleted_at'); 
}))->get(); 

但我不知道這件事,不知道有足夠的瞭解你的人際關係,所以纔給你出個主意。

+0

欣賞響應。就我試圖達成的目標而言,你正在激怒。不幸的是,似乎渴望負載期望接收關係,並通過提供isActive(這是一個集合),上面的行爲並不像我希望的那樣工作。 – mistermat

+0

你也可以查看[這篇文章](http://heera.it/laravel-model-relationship),聽起來類似。 –

+0

也檢查更新的答案,我沒有注意到你的'ssActive'代碼。 –