【问题标题】:How to retrieve full relationships from an item that has a relationship with itself?如何从与自身有关系的项目中检索完整的关系?
【发布时间】:2019-12-04 05:41:54
【问题描述】:

我有 cmets 和对这些 cmets 的回复,我想带来完整的关系。我想在调用回复时带上所有的评论关系。这有点令人困惑,所以让我证明我的意思是用实际数据。

这是模型

class ForumReply extends Model
{
    protected $fillable = [
        'user_id',
        'bulletin_id',
        'comment',
        'anonymous'
    ];

    public $timestamps = true;

    public function discussionForum()
    {
        return $this->belongsTo(DiscussionForum::class);
    }

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

    public function replies()
    {
        return $this->hasMany(ForumReply::class, 'parent_id');
    }
}

这是控制器中的函数

public function show($id)
{
    $forum = DiscussionForum::findOrFail($id)
        ->with('comments', 'user')->first();
    $comment = ForumReply::with('discussionForum', 'user', 'replies')
        ->where('discussion_forum_id', $forum->id)
        ->orderByDesc('comment_time')->get();

    return Inertia::render('Forum/View.vue', [
        'forum' => $forum,
        'comments' => $comment
    ]);
}

这是我在 vue 中为 $comment 查询获得的数据,您可以看到回复部分的信息很少,为了按我的意愿显示它,我需要更多信息,例如回复的人不仅仅是有家长评论的人。

{ 
   "id":4,
   "user_id":41,
   "discussion_forum_id":1,
   "parent_id":null,
   "comment":"adsfasdf asdf asdfa sdf ",
   "comment_time":"2019-12-03 11:25:00",
   "created_at":null,
   "updated_at":null,
   "discussion_forum":{ 
      "id":1,
      "theme":"asdfa",
      "description":"asdffghjluui",
      "user_id":1,
      "anonymous":0,
      "start_date":"2019-11-24 06:00:00",
      "end_date":"2019-12-30 06:00:00",
      "created_at":"2019-11-27 13:21:03",
      "updated_at":"2019-11-27 13:21:03"
   },
   "user":{ 
      "id":41,
      "name":"Isadora Felix",
      "card":"12346",
      "scard":"97531",
      "user_type_id":4,
      "email":"i@email.com",
      "created_at":"2019-12-03 10:09:26",
      "updated_at":"2019-12-03 10:09:26"
   },
   "replies":[ 
      { 
         "id":6,
         "user_id":39,
         "discussion_forum_id":1,
         "parent_id":4,
         "comment":"not agreeing",
         "comment_time":"2019-12-03 11:26:01",
         "created_at":null,
         "updated_at":null
      }
   ]
}

是否有另一种方法可以让我可以获取有关回复的信息,就像它是家长评论一样?还是有更好的方法来解决这个问题?

【问题讨论】:

    标签: laravel


    【解决方案1】:

    您可以使用点符号加载嵌套关系。 例如:

    $forum = DiscussionForum::with(['user', 'comment' => function ($query) {
        return $query->orderByDesc('comment_time');
    }, 'comment.user', 'comments.replies.user'])->findOrFail($id);
    

    此代码将加载用户和 cmets 及其作者的讨论论坛。然后对于每条评论,它还会检索其各自作者的回复。

    旁注:请记住,findOrFail($id) 实际上执行的是查询。如果您随后调用->with(...)->first(),您正在对数据库执行第二次查询。 您可以改为从::with(...) 方法开始,然后调用->findOrFail($id)

    【讨论】:

    • 所以我应该改为$forum = DiscussionForum::with('comments.replies.user', 'user', 'comments.user')->findOrFail($id); ?
    • 没错。我还更新了我的答案,包括对 cme​​ts 的创建时间的降序,这应该也可以工作
    【解决方案2】:

    如果您知道您永远不想在没有用户的情况下访问 ForumReply,您可以将用户添加到受保护的“with”属性中,以便始终将其附加到此类型的每个模型中

    class ForumReply extends Model
    {
       protected $with = ['user'];
    }
    

    这将为您节省包含用户的代码,并且还有助于下一部分

    除非您将 ForumReplies 限制为只有一个回复,否则您必须考虑关系的嵌套级别。然而,有一个简单的解决方法,让你的关系递归。

    public function replies()
    {
      return $this->hasMany(ForumReply::class, 'parent_id')->with('replies');
    }
    

    这两个更改的组合将加载对某个回复的所有回复,即使它们正在回复另一个回复,并将用户附加到每个回复。

    【讨论】:

      猜你喜欢
      • 2020-08-20
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多