首页 > 解决方案 > Laravel 6 Eloquent - 三个表和枢轴之间的关系

问题描述

我有三个表,我想关联所有 3 个,但我不知道如何。

我有一个用户表和两个用于帖子和类别的表,类别也将类别和子类别存储在同一个表上(使用类型列分开)。

帖子和用户也有一个数据透视表以及帖子和类别。但我想通过以下类别获取用户帖子:

类别或子类别 -> 帖子 -> 用户

类别型号:

class Category extends Model
{

    protected $fillable = ['name', 'description', 'type', 'category_id','post_id'];

    public function posts() {

        return $this->belongsToMany(Post::class)->withPivot('post_id');

    }
}

岗位型号:

class Post extends Model {

    public function users() {
        return $this->belongsToMany(User::class, 'post_user','post_id', 'user_id')->withTimestamps();
    }


    public function categories() {
        return $this->belongsToMany(Category::class)->withPivot('category_id');
    }

用户型号:


class User extends Authenticatable {

    public function posts() {
        return $this->belongsToMany(Post::class, 'post_user', 'user_id', 'post_id')->withTimestamps();
    }

然后在控制器中我只有这个

$posts = Category::with('posts')->get();

我不知道如何关联这三个表。也许我只需要在 3 个表之间制作一个数据透视表?

编辑:感谢Qirel帮助我关联表格:

Category::with('posts.users');

然后我只想显示特定用户发布的类别,例如

Category::with('posts.users')->where('user.id',1);

有可能的?

标签: phplaraveleloquentpivot-table

解决方案


正如评论中所讨论的,这可以通过嵌套关系来实现。

使用预先加载通过 using 来“预加载”关系数据with(),并通过使用您想要的过滤器使用关系条件whereHas(),确保您只获得与该条件匹配的关系的记录 - 在您的情况下,它只会加载特定用户发布的类别。

$user_id = 1;
Category::with('posts.users')
        ->whereHas("posts.users", function($query) use ($user_id) { 
            $query->where("id", $user_id); 
        })
        ->get();

您还可以获取所有类别(无论提供的用户是否已发布),但将关系数据限制为仅来自该用户(这意味着您可以获得所有类别,但仅获取 ID 为 1 的用户是发布者的帖子) . 您可以通过在急切加载上设置条件来实现这一点(请注意,与whereHas()上面的使用不同,这是一个键/值配对数组)。

$user_id = 1;
Category::with(['posts.users' => function($query) use ($user_id) { 
            $query->where("id", $user_id); 
        }])
        ->get();

推荐阅读