使用帖子类别和用户首选项在Laravel中构建博客

I'm building a blog for fun. In my blog, I have users, posts, and a fixed list of predefined categories.

1) Posts belong to many categories. 2) Users can specify category preferences, and therefore belong to many categories.

I have this set up as a series of many-to-many relationships:

In User.php:

/**
* A user belongs to many categories
*/
public function categoryPreferences()
{
    return $this->belongsToMany('App\Category');
}

In Post.php:

/**
* A Post Can Have Many Likes
*
* @return \Illuminiate\Database\Eloquent\Relations\belongsToMany
*/

public function categories()
{
return $this->belongsToMany('App\Category');
}

And the inverse of each in Category.php:

/**
* A category belongs to many users
*/
public function users()
{
return $this->belongsToMany('App\User');
}

/**
* A category belongs to many posts.
*
* @return \Illuminiate\Database\Eloquent\Relations\belongsToMany
*/

public function posts()
{
return $this->belongsToMany('App\Post');
}

I have corresponding category_post and category_user join tables to support each relationship. However, I may be thinking about this incorrectly.

I would like to display a loop of posts that belong to categories that users have specified, but can't work through how to do that. I can easily collect a user's category preferences with:

$categories = $user->categoryPreferences->pluck('id');

And can do the same for posts:

$categories = $post->categories->pluck('id')

However, I'm unsure how to merge the two collections together. I've looked into polymorphism, but that doesn't seem quite right. Can someone point me toward the correct concept?

I think, better use Query Builder instead ORM, code will be better to reading and writing.

The relation $user->categoryPreferences will give you a collection of Category models which has an entry in the pivot table for the corresponding user.

Now you could iterate over each category model in this collection and access the posts by using the each() method on the collection.

From the Laravel Documentation,

The each method iterates over the items in the collection and passes each item to a callback:

(in your case)

$user->categoryPreferences->each(function ($category, $key) {
  echo $category->post;
});

This assumes you have defined a post relation for the Category Model. Also remember to filter out duplicate posts.