我有以下三个表格:
帖子:
class Post extends Eloquent
{
public function comments()
{
return $this->hasMany(Comment::class,'post_id','id');
}
}
** Post data **
{
'id' : 1,
'title' : 'bla bla',
'created_at: 'some date'
}
评论:
class Comment extends Eloquent
{
public function comments()
{
return $this->belongsTo(Post::class,'id');
}
public function tags()
{
return $this->hasMany(Tag::class,'id','tags_ids');
}
}
** Comments data **
{
'id' : 322,
'active' : true
'post_id' : 1,
'created_at: 'some date',
'tags_ids' : [1,2,3]
}
标签:
class Tag extends Eloquent
{
public function tags()
{
return $this->belongsTo(Comment::class,'tags_ids');
}
}
** Tags data **
{
{'id' : 1,
'description' : 'some description1'
},
{'id' : 2,
'description' : 'some description2'
},
{'id' : 3,
'description' : 'some description3'
}
}
Post表有许多注释,comments表有许多与之关联的标记。
如何使用“快速加载”将所有这些表组合在一起?
比如:
$post = Post::where('id',1)->with(['comments' => function($q) {
$q->with('tags');
}])->first();
但是这个查询总是在标记关系中返回空响应。
我做错了什么?
期望的结果是这样的:
{
'id' : 1,
'title' : 'bla bla',
'created_at: 'some date',
'comments':[{
'id' : 322,
'active' : true
'post_id' : 1,
'created_at: 'some date',
'tags_ids' : [1,2,3],
'tags' : [
{'id' : 1,'description' : 'some description1'},
{'id' : 2, 'description' : 'some description2'},
{'id' : 3,'description' : 'some description3'}
],
}
]
}
你可以看到帖子里面包含评论,评论里面也包含标签关系。
另外,我在我的项目中使用了“jenssegers/laravel mongodb”包,我试图在没有任何原始表达的情况下使用它。
谢谢
更新:必须修复数据库架构
表结构如下所示:
- posts
- id
- title
- ...
- comments
- id
- active
- post_id
- created_at
- tags
- id
- description
- comment_id
- created_at
// App\Post
class Post extends Eloquent
{
public function comments()
{
return $this->hasMany(Comment::class,'post_id','id');
}
}
// App\Comment
class Comment extends Eloquent
{
public function post()
{
return $this->belongsTo(Post::class);
}
public function tags()
{
return $this->hasMany(Tag::class);
}
}
//App\Tag
class Tag extends Eloquent
{
public function comment()
{
return $this->belongsTo(Comment::class);
}
}
//...
$post = Post::with(['comments', 'comments.tags'])->find(1);
//...
你可以用
$post = Post::where('id',1)->with(['comments.tags'])->first();
它将加载所有注释以及注释。标签
参考链接https://laravel.com/docs/6.x/eloquent-relationships在链接搜索中嵌套的即时加载
你对人际关系的定义是错误的。您的注释模型中有标记\u id
作为数组,但您需要标记的多对多关系。要实现这一点,您必须定义一个新的表注释标记
:
comment-tag
comment_id - unsined big integer
tag_id - unsigned big integer
然后在你的Comment
模型中修改tags
关系如下:
class Comment extends Model
{
/**
* The tags that belong to the comment.
*/
public function tags()
{
return $this->belongsToMany('App\Tag');
}
}
这种关系的反比是:
class Tag extends Model
{
/**
* The comments that belong to the tag.
*/
public function comments()
{
return $this->belongsToMany('App\Comment');
}
}
然后,要加载嵌套关系,可以使用“点”语法:
$post = Post::with(['comments', 'comments.tags'])->find(1);
有关更多信息,请参阅Laravel文档上的多对多关系。
拉威尔说: 我需要的是这样的东西 我们可以在一个关系中加载多个关系。 这有可能吗?
你一定看过下面的功能(在facebook上),一个有一些评论的帖子,每个评论都有一个类似的计数器。 https://img4.hostingpics.net/pics/67853820170616003640LaravelNewsAccueil.png 在拉雷维尔,这将是类似的 帖子有很多评论 以下评论发布 类似于用户的评论 CommentLike belong评论 评论有很多类似的评论 所以,现
我对雄辩的质询有意见。我正在使用渴望加载(一对多多态关系)来排序“historyable”。日期见下文。 我试着得到这样的结果 是否有可能运行嵌套懒惰渴望加载Laravel? 产品型号 历史模型 产品控制器 我有这样的数据库
我正在建立一个小博客,我想使用内置的雄辩的渴望加载,但我希望它作为一个明确的加入。 下面是我试图做的,使用连接,它可以工作,但不是我想要的方式。 我的问题是,我不能像这样在我的帖子中使用用户模型: $帖子[0]- 通过连接,用户的数据直接设置在post模型上,因此我必须像这样使用它: $帖子[0]- 问题是:我想使用我的用户模型,因为它里面有一些我想使用的方法。一个用于打印全名,一个用于打印其网址
问题内容: SQLAlchemy支持渴望加载关系,这基本上是一条语句。但是,如果模型具有两个或多个关系,则可能是非常庞大的联接。例如, 该查询的性能实在是太差了,因为中和会产生一个巨大的表。但是和在这里没有关系,因此它们不应该是。它应该是两个分开的查询。并且由于会话具有某种程度的缓存,因此我将查询更改为此。 这次的性能要好得多。但是,我不认为这样做是正确的。我不确定会话结束时标签缓存是否会过期。
在我的网站中,我有用户、角色和权限。 每个用户属于多个角色(例如User.php)和称为“role_user”的数据透视表 每个角色都属于许多权限(例如Role.php)和名为“permission\u Role”的透视表 我想以某种方式访问用户权限,但我似乎无法弄清楚。基本上,我需要这样的东西在User.php 这可能吗?请帮忙。谢谢你。