获取名称而不是ID一对一关系

时间:2019-06-07 17:40:47

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

我有一个make表和post表。 Make表将品牌名称另存为make_codemake_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';
}

POSTS TABLE SCREENSHOT

MAKE TABLE SCREENSHOT

1 个答案:

答案 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-ManyOne-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。