【问题标题】:Laravel relationship, do I need extra table for relating commentsLaravel 关系,我需要额外的表格来提供相关评论吗
【发布时间】:2018-06-07 07:52:10
【问题描述】:

我需要一些逻辑帮助,我有一个文章表和一个 cmets 表。当用户 cmets 我将其存储在表中时:

public function up()
{
  Schema::create('comments', function (Blueprint $table) {
      $table->increments('id');
      $table->string('user_id');
      $table->string('comment');
      $table->integer('article_id');
      $table->timestamps();
  });
}

我不知道是否需要添加另一个表(例如user_comments)来建立这种关系,这对我来说实际上听起来很愚蠢,但我在这里遇到的问题是我得到的 cmets基本查询,例如:

$comments = DB::select("Select * from comments where article_id=$articleID");

但是我很难展示username 之类的东西,所以我需要一个简单的关系,有人知道如何实现它吗?

【问题讨论】:

    标签: mysql laravel laravel-5.4 relationship


    【解决方案1】:

    不,您不需要添加另一个表。您只需要定义适当的关系。在Article 模型中:

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
    

    Comment 模型中:

    public function user()
    {
        return $this->belongsTo(User::class);
    }
    

    要获取username,请使用nested eager loading

    $article = Article::with('comments.user')->find($articleId);
    

    然后在视图中迭代集合:

    @foreach ($article->comments as $comment)
        <div>{{ $comment->comment }}</div>
        Comment author: {{ $comment->user->username }}
    @endforeach
    

    【讨论】:

    • 这很好,但我不能只做@foreach ($article-&gt;comments as $comment) 而不是$comment-&gt;user-&gt;username 一旦我通过article 吗?
    • 顺便说一句,你是说Article::with 吗?
    • @Nikonah 是的,我的意思是Article::with,谢谢,已修复。如果您不使用with()$comment-&gt;user-&gt;username 将生成 N 个额外的查询。所以,如果你加载 100 个 cmets,Laravel 将生成 101 个查询到 DB 而不是 2 个。
    • 完美。它按预期工作!我将您的答案标记为正确。但是一个小问题。假设我有另一个表,其中iduser id 相同,我调用id userprofil,我想访问该表而不是user 表,但每次我尝试这样做时,外来键和事情搞砸了,对此的任何意见都会对我有很大帮助。
    • @Nikonah 这真的取决于CommentUserProfile 模型之间的关系。如果您无法解决这个新问题,请创建一个新问题并发布所有相关代码(关系、查询)。
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多