当前位置: 首页 > 知识库问答 >
问题:

Laravel雄辩-渴望加载嵌套关系

拓拔元徽
2023-03-14

我有以下三个表格:

  • 帖子

帖子:

    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”包,我试图在没有任何原始表达的情况下使用它。

谢谢

共有3个答案

苏运良
2023-03-14

更新:必须修复数据库架构

表结构如下所示:

- 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);
//...
卢子民
2023-03-14

你可以用

$post = Post::where('id',1)->with(['comments.tags'])->first();

它将加载所有注释以及注释。标签

参考链接https://laravel.com/docs/6.x/eloquent-relationships在链接搜索中嵌套的即时加载

祁俊喆
2023-03-14

你对人际关系的定义是错误的。您的注释模型中有标记\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 这可能吗?请帮忙。谢谢你。