2015-09-09 159 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()' –