2015-09-09 128 views
2

假设我有一个User模型和一个Post模型。查询一对多关系集合

class Post extends Eloquent 
{ 

} 

有许多用户,每个User有许多Post。全部Post属于User

class User extends Eloquent 
{ 
    public function posts() 
    { 
     return $this->hasMany('Post'); 
    } 
} 

我知道我能得到一个Userfind()

$user = User::find(1); 

我知道,从一个单一的User,我可以得到所有他们posts()

$posts = User::find(1)->posts; 

但是,现在假设我有多个用户。

$users = User::all(); 

我想访问这个用户集合的所有帖子。东西沿线

$posts = User::all()->posts; 

这当然是行不通的。然而,从理论上讲,它应该是功能上等同于

$posts = Post::all() 

有没有办法做到在Laravel 4.2与上述类似的东西吗?


我不想使用Post::all()。原因是它不会是我想要的更复杂的示例,其中涉及对User的限制。

$postsByMaleUsers = User::where('gender', '=', 'male')->posts; 

应该获得男性用户发布的所有帖子。


我也知道,我可以简单地使用foreach循环。

foreach($users->posts as $post) 
{ 
    // Process result here. 
} 

但是,假设我试图返回结果而不是处理结果。例如,我可以在User模型中使用public static function postsByMaleUsers(),并且调用User::postsByMaleUsers()应仅返回男性用户的帖子集合。在这种情况下,foreach循环将不适合我。

回答

1

Eager load的帖子,然后用pluckcollapse获得职位的平集合:

$users = User::with('posts')->where('gender', 'male')->get(); 

$posts = $users->pluck('posts')->collapse(); 
+0

您好,感谢的解决方案,但不幸的是,它看起来像'pluck'未在Laravel 4.2实现。在4.2版本中是否有任何等价的方法,或者如果没有升级到5,我是否运气不佳? – Zsw

+0

@Zsw - 'lists()' –