我有一个make
表和post
表。 Make
表将品牌名称另存为make_code
和make_name
。
帖子表中有一列make
。保存帖子时,它将在make_code
中保存品牌。
在刀片中显示时,我希望它显示为make_name
。我该怎么办?
当前{{$post->make}}
给了我make_code
。我需要显示make_name
。
我认为这是一对一的关系。我尝试将其放入模型中,但是没有用。我该如何实现?
制作模型
class Make extends Model
{
public function make()
{
return $this->belongsTo(App\Post::class);
}
}
POST模式:
class Post extends Model
{
protected $table = 'posts';
}
答案 0 :(得分:1)
蒂姆·刘易斯(Tim Lewis)注意到:
这些关系不能命名为make,因为这是冲突。
假设您的关系是这样的:
Make
有很多Post
Post
属于Make
对象。|注意:如果我错了,请纠正我。
所以,如果这是正确的,则应该这样定义您的关系:
Post.php
public function make_rel()
{
return $this->belongsTo(Make::class, 'make', 'make_code');
}
Make.php
public function posts()
{
return $this->hasMany(Post::class, 'make', 'make_code');
}
检查文档的One-to-Many和One-to-Many (Inverse)关系部分。
因此,您可以在控制器中(或任何需要的地方)进行操作:
$post = Post::find(1);
dd($post->make_rel->make_name); // 'Harley Davidson'
此外,您可以创建一个计算属性作为精简版,以访问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 primary键而不是custom键相关联。这将加快查询的执行速度,因为默认情况下会索引原始ID。