Laravel/Inertia: 从外键的外键调用主键

Laravel/Inertia: calling a primary key from a foreign key of a foreign key

我目前正在使用 Laravel、Inertiajs 和 Vuejs 创建博客,我需要一些有关获取用户名的逻辑方面的帮助。

我有 3 个 table:

用户:

博客:

评论:

我有一个博客页面,它嵌套在来自 web.php:

的动态路由中

Route::get('/blogs/{id}', [BlogController::class, 'show'])->name("blogs.show");

博客页面包含博客 post 和评论部分,正在由 BlogController 调用:

public function show(Blog $id)
    {
        $user = User::find($id->user_id)->name;

        return Inertia::render('Components/Blog', [
            'blog' => [
                    'id' => $id->id,
                    'name' => $user,
                    'title' => $id->title,
                    'body' => $id->body,
                    'created_at' => $id->created_at,
                    'updated_at' => $id->updated_at,
                    'comments' => $id->blogComments()->orderByDate()->get()->all(),
            ],
        ]);
    }

就获取博主的用户名而言,它在 $user = User::find($id->user_id)->name; 中工作得很好,并作为 blog 道具从 Vue 组件回调:<p>{{ blog.name }}</P>。现在,我想要的是在评论部分也调用用户名(参见下面的目标)。

上面的评论部分是从 BlogController 中的 show() 方法调用的:

<template>
  <div>
    <div
      v-for="comment in blog.comments"
      :key="comment.id"
      class="hover:bg-gray-100 focus-within:bg-gray-100"
    >
      <p>comment id: {{ comment.id }}</p>
      <p>comment body: {{ comment.body }}</p>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    blog: Object,
  },
};
</script>

但我的问题是,我无法完全理解从 show() 方法中的 Users table 获取用户名的逻辑。截至目前,博客 table 与评论 table 之间存在一对多关系,方法是将评论 table 中的外键调用到博客 table 在控制器上:'comments' => $id->blogComments()->orderByDate()->get()->all(),

那么如何通过将评论 table(在 BlogController 内)中的外键调用到用户 table 中的主键来在此添加另一层?

我已经做了几个小时了,我确信我只是遗漏了一些简单的东西,所以如果有新的眼睛来看待这个,我将不胜感激。

谢谢。

如果我没猜错的话,我想你想在评论区加上评论的作者姓名。

因此,您需要在评论和用户之间添加如下关系:

class Comment extends Model
{
    /**
     * Get the author that wrote the book.
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

然后按如下所示更改 Inertia 中的注释以加载用户模型:

'comments' => $id->blogComments()->with('users')->orderByDate()->get()->all(),

然后你可以这样获取评论作者:

<div
  v-for="comment in blog.comments"
  :key="comment.id"
  class="hover:bg-gray-100 focus-within:bg-gray-100"
>
  <p>comment id: {{ comment.id }}</p>
  <p>comment body: {{ comment.body }}</p>
  <p>comment author: {{ comment.user.name }} </p>
</div>

请试试这个,如果有效请告诉我。