获取name而不是id一对一关系

Get name instead of ID one to one relationship

我有一个 make table 和 post table。 Make table 将品牌名称保存为 make_codemake_name。 Post table 有一个列 make。在保存 post 时,它会在 make_code.

中保存 make

在 blade 中显示时,我希望它显示为 make_name。我该怎么做?

目前 {{$post->make}} 给我 make_code。我需要它来显示 make_name.

我认为这是一种 one-to-one 关系。我试着把它放在模型中但没有用。我怎样才能实现它?

制作模型

 class Make extends Model
    {
        public function make()
        {
            return $this->belongsTo(App\Post::class);
        }
    }

POST 型号:

class Post extends Model
{
    protected $table = 'posts';
}

更新

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

the relationships can't be named make, as that's a conflict.

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

  • 一个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');
}

Check the One-to-Many and One-to-Many (Inverse) relationship sections of the documentation.

因此,您可以在控制器中(或任何您想要的地方)执行以下操作:

$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(在您的 'posts' table 中)以避免冲突。此外,鉴于此 link 几乎不可见并且由 Laravel 处理,因此您可以将 post 与 make 主键而不是自定义键相关联。这将加快查询的执行速度,因为默认情况下会为主要 ID 编制索引。