首页 > 解决方案 > 获取名称而不是 ID 一对一关系

问题描述

我有一张make桌子和post一张桌子。Make表将 make 名称保存为make_codemake_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';
}

帖子表屏幕截图

制作表格屏幕截图

标签: phplaraveleloquentlaravel-5.5laravel-5.8

解决方案


更新

正如蒂姆刘易斯注意到的那样:

这些关系不能命名为make,因为这是冲突。

假设你们的关系是这样的:

  • 一个Make有很多Post
  • aPost属于一个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'

建议

作为建议,我强烈建议您将外键列从更改makemake_id(在您的“帖子”表中)以避免冲突。此外,鉴于此链接几乎不可见并且由 Laravel 处理,您可以将帖子与 make 主键而不是自定义键相关联。这将加快查询的执行速度,因为默认情况下对主 ID 进行索引。


推荐阅读