2014-03-27 81 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'代码。 –