2015-09-09 3 views
2

Предположим, у меня есть модель User и модель Post.Запрос коллекции «один ко многим»

class Post extends Eloquent 
{ 

} 

Есть много пользователей, и каждый User имеет много Post. Все Post принадлежит к User.

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

Я знаю, что я могу получить один User с find().

$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. 
} 

Однако предположим, что я пытаюсь вернуть результаты вместо обработки результатов. Например, я мог бы иметь public static function postsByMaleUsers() в модели User, и вызов User::postsByMaleUsers() должен возвращать коллекцию сообщений только пользователями-мужчинами. В этом случае цикл foreach меня не устраивает.

ответ

1

Eager load посты, а затем использовать pluck и collapse, чтобы получить плоский сборник сообщений:

$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()' –

Смежные вопросы