php - 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);
有可能的?
解决方案
正如评论中所讨论的,这可以通过嵌套关系来实现。
使用预先加载通过 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();
推荐阅读
- sql - 如何获取两列日期(fromDate 和 toDate)之间的所有日期。并且获得的日期必须在单行中,以逗号分隔
- c++ - 无法在 C++ 代码块中构建和运行
- opencv - 单点错误三角测量(用 4 点板校准)
- css - 如何在 Bootstrap 4 的页面上放置“卡片”?
- kotlin - Java/Kotlin 输出 Ed25519 密钥对作为 JCE KeyPair 实例和 OpenSSH 格式
- javascript - JavaScript 计算季度计费
- python-3.x - Python:删除列表中所有元素的好习惯是什么?
- c# - ASP.NET Core MVC Web API 部署问题
- php - 会话变量在php中不断覆盖
- java - 我们可以将 jars 添加到 websphere 库吗