php - 获取名称而不是 ID 一对一关系
问题描述
我有一张make
桌子和post
一张桌子。Make
表将 make 名称保存为make_code
和make_name
。Post 表有一列make
。保存帖子时,它会保存 make in make_code
。
在刀片中显示时,我希望它显示为make_name
. 我该怎么做?
目前{{$post->make}}
给我make_code
。我需要它来显示make_name
。
我认为这是需要的一对一关系。我试着把它放在模型中,但没有奏效。我怎样才能实现它?
制作模型
class Make extends Model
{
public function make()
{
return $this->belongsTo(App\Post::class);
}
}
后模型:
class Post extends Model
{
protected $table = 'posts';
}
解决方案
更新
正如蒂姆刘易斯注意到的那样:
这些关系不能命名为make,因为这是冲突。
假设你们的关系是这样的:
- 一个
Make
有很多Post
- a
Post
属于一个Make
对象。
| 注意:如果我错了,请纠正我。
所以,如果这是正确的,你应该像这样定义你的关系:
Post.php
public function make_rel()
{
return $this->belongsTo(Make::class, 'make', 'make_code');
}
制作.php
public function posts()
{
return $this->hasMany(Post::class, 'make', 'make_code');
}
因此,您可以在控制器(或任何您想要的地方)中执行以下操作:
$post = Post::find(1);
dd($post->make_rel->make_name); // 'Harley Davidson'
此外,您可以创建一个计算属性作为 shorcout 以在您的 Post 模型中访问此相关属性:
Post.php
// ...
public function getMakeNameAttribute()
{
return $this->make_rel->make_name;
}
现在,您可以像这样访问它:
$post = Post::find(1);
dd($post->make_name); // 'Harley Davidson'
建议
作为建议,我强烈建议您将外键列从更改make
为make_id
(在您的“帖子”表中)以避免冲突。此外,鉴于此链接几乎不可见并且由 Laravel 处理,您可以将帖子与 make 主键而不是自定义键相关联。这将加快查询的执行速度,因为默认情况下对主 ID 进行索引。
推荐阅读
- r - 如何存储 var(data) 的结果(方差函数)
- mysql - 将十进制值插入 MySQL 5.7 (Azure) 时出现 SSIS 错误
- c++ - Makefile 混淆'errno=2 for architecture x86_64'
- google-sheets - 如何根据excel表中的列值最多选择N行?
- visual-c++ - 将图像直接保存到 _variant_t
- c# - 事务回滚后正在更新 EF6 数据
- html - 在 Markdown 中更改颜色标签
- c++ - 为什么不调用重载函数?
- docker - 如何让 docker-compose 在 up --rm 或 build --no-cache 使用后在 down 期间不删除容器
- c# - C# 如何在 WinForms 中使用计时器?