如何选择第三张Laravel表?

时间:2017-02-25 14:12:38

标签: laravel laravel-5.3

我有Posts表。

每个Post都有类别:

Post_categories
 _________________
id post_id | category_id

还有表格:

User_categories
__________________
category_id | user_id

因此,我需要从Post表中选择所有行,其中User_categories.user_id =9User_categories.category_id = Post_categories

所以,其他的话,我需要展示用户订阅的类别的文章。

2 个答案:

答案 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

首先,您需要为PostCategoryUser定义模型。

之后确保根据您的需要定义了正确的关系,但正如我从您的问题中理解的那样,您需要多对多的关系。 对于这种关系,您还需要创建数据透视表。作为惯例,您将它们命名为category_postcategory_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;