我有Posts
表。
每个Post
都有类别:
Post_categories
_________________
id post_id | category_id
还有表格:
User_categories
__________________
category_id | user_id
因此,我需要从Post
表中选择所有行,其中User_categories.user_id =9
和User_categories.category_id = Post_categories
。
所以,其他的话,我需要展示用户订阅的类别的文章。
答案 0 :(得分:2)
用Eloquent的方式再试一次。
在Post模型类中,使用Category模型定义多对多关系。 (数据透视表是 Post_categories )
class Post {
public function categories()
{
return $this->belongsToMany('App\Category', 'Post_categories', 'post_id', 'category_id');
}
}
在User模型类中,使用Category模型定义多对多关系。 (数据透视表是 User_categories )同样在这个类中,将posts()函数定义为关系存在的查询。
class User {
public function categories()
{
return $this->belongsToMany('App\Category', 'User_categories', 'user_id', 'category_id');
}
public function posts()
{
return App\Post::whereHas('categories', function ($query) use($this) {
$query->whereIn('posts.cat_id', array_column($this->categories->toArray(), 'categories.id'));
});
}
}
获取用户订阅的帖子
App\User::find(9)->posts;
希望这有帮助。
答案 1 :(得分:0)
我建议从阅读文档开始: https://laravel.com/docs/5.4/eloquent
在这里: https://laravel.com/docs/5.4/eloquent-relationships
特别是这部分: https://laravel.com/docs/5.4/eloquent-relationships#many-to-many
首先,您需要为Post
,Category
和User
定义模型。
之后确保根据您的需要定义了正确的关系,但正如我从您的问题中理解的那样,您需要多对多的关系。
对于这种关系,您还需要创建数据透视表。作为惯例,您将它们命名为category_post
,category_user
(数据透视表中两个模型的小写名称,按字母顺序排列)
您的数据透视表迁移应该类似于category_post
:
public function up()
{
Schema::create('category_post', function (Blueprint $table) {
$table->integer('category_id')->unsigned()->index();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
$table->integer('post_id')->unsigned()->index();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
$table->primary(['skill_id', 'user_id']);
$table->timestamps();
});
}
设置表后,您必须确保正确定义了关系。
之后,您应该可以执行以下操作:
User::find(9)->posts;