【问题标题】:Get name instead of ID one to one relationship获取名称而不是 ID 一对一关系
【发布时间】:2019-10-23 05:42:44
【问题描述】:

我有一个make 表和post 表。 Make 表将 make 名称保存为 make_codemake_name。 Post 表有一列 make。保存帖子时,它会保存make_code中的make。

在刀片中显示时,我希望它显示为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';
}

【问题讨论】:

  • 你也必须定义逆;所以hasOne 在你的Post 模型上。另外,您的posts 表是否有一个名为make 的列?
  • 是的,它确实有一个专栏。
  • 如果您尝试将关系定义为public function make(),这将导致问题。通常,为了使表相互关联,您定义{table}_id,因此您的posts 表将有一个与idmakes 相关的make_id 列。你现在拥有它的方式是可行的,但可能会有问题。无论哪种方式,定义PostMake 之间的关系。此外,在您的 Make 模型上,关系应该是 public function post(),因为它与 Post 模型相关。

标签: php laravel eloquent laravel-5.5 laravel-5.8


【解决方案1】:

更新

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

关系不能命名为 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-ManyOne-to-Many (Inverse) 关系部分。

所以,你可以在你的控制器中(或任何你想要的地方):

$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。

【讨论】:

  • 看表; posts 有一个名为make 的列,因此不能将关系命名为make,因为这是冲突。其他一切都是正确的,但这是一个命名警告。
  • @TimLewis 哦,我错过了那一点,我现在会添加它。谢谢指正。
  • 没问题。如果可能的话,我建议将列名更改为make_id(尽管关系是在代码上而不是id上,所以可能不是),但是使用不同的关系名称也可以,比如public function rMake()(相关品牌),或类似的。
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2012-03-02
  • 2015-01-27
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多