0

I have a Laravel table posts with multiple categories. How can I fetch all the posts grouped by categories? I was doing something like Post::where('userID', 1)->groupBy('categoryID'). But this only returned a flat array of named arrays like this:

[1 => ['title'=>'title 1'], 2 => ['title'=>'title3']]

How can I return an array of arrays like this:

[1 => [['title'=>'title 1'], ['title' => 'title 2], 2 => [['title'=>'title 3']]]

UPDATE: I'm currently doing a join and then use Laravel's collection to sort it in php:

   Post::join('categories', ....).where('userID', 1)->get()->groupBy('categoryID');

I am able to get what I want, but wondering if there is a better way?

1 Answer 1

1

You may want this:

$catsWithPosts = Category::with(array('posts' => function($query){
    $query->select('title')->where('userID', 1);
}))->get();

Assumed that, you have declared proper relationship between Post and Category model.

Sign up to request clarification or add additional context in comments.

4 Comments

Thanks, but the userID is on posts. This seems to be not working.
Which table contains category_id ?
This seems to work. But looking at the documentation, I'm wondering if I'm doing n queries depending on my categories count? laravel.com/docs/eloquent
No, it's not n+ queries because it's using eager loading technique.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.