Laravel/Inertia: 从外键的外键调用主键
Laravel/Inertia: calling a primary key from a foreign key of a foreign key
我目前正在使用 Laravel、Inertiajs 和 Vuejs 创建博客,我需要一些有关获取用户名的逻辑方面的帮助。
我有 3 个 table:
用户:
- id (pk)
- 姓名
博客:
- id (pk)
- user_id(外键)
评论:
- id (pk)
- blog_id(外键)
- user_id(外键)
我有一个博客页面,它嵌套在来自 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>
请试试这个,如果有效请告诉我。
我目前正在使用 Laravel、Inertiajs 和 Vuejs 创建博客,我需要一些有关获取用户名的逻辑方面的帮助。
我有 3 个 table:
用户:
- id (pk)
- 姓名
博客:
- id (pk)
- user_id(外键)
评论:
- id (pk)
- blog_id(外键)
- user_id(外键)
我有一个博客页面,它嵌套在来自 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>
请试试这个,如果有效请告诉我。