Laravel一对多关系

时间:2019-04-03 04:44:56

标签: laravel

我有一个Author模型和Blog模型。

我还用author_idblog_id设置了一个表。该表称为“ author_blog”

以下是我定义我的人际关系的方式:

作者模型:

public function blogs()
{
   return $this->hasMany('App\Blog', 'author_id');
}

博客模型:

public function author()
{
    return $this->belongsTo('App\Author', 'blog_id');
}

我认为我正在尝试$blog->author->first_name。名字是“作者”表上的一列。

我不断得到

  

试图获取非对象的属性。

有什么想法吗?

更新:

我已经删除了中间表,而是在博客表上放置了一个“ author_id”,并将其缩短了。

作者模型:

public function blogs()
    {
        return $this->hasMany('App\Blog');
    }

博客模型:

public function author()
    {
        return $this->belongsTo('App\Author');
    }

在我的BlogController中,定义视图时,我通过$blogs = Blog::all();抓取了博客集

在我看来,我只是在博客中循环浏览,以显示每个人的个人风格……

@foreach ($blogs as $blog)
<div>{{ $blog->author->first_name }}</div>
@endforeach

2 个答案:

答案 0 :(得分:0)

对于一对多关系,您不需要另一个表来处理外键。

只需在您的author_id表中添加blogs外键。然后定义你的关系 像下面一样,

作者模型:

public function blogs()
{
   return $this->hasMany('App\Blog', 'author_id');
}

博客模型:

public function author()
{
    return $this->belongsTo('App\Author', 'author_id');
}

视图: 在此之前,请确保您的查询返回有效的集合。

@foreach ($blogs as $blog)
<div>@if( $blog->author) {{ $blog->author->first_name }} @endif </div>
@endforeach

有关更多详细信息:https://laravel.com/docs/5.8/eloquent-relationships#one-to-many

答案 1 :(得分:0)

通过belongsToMany关系,您可以定义中间表(author_blog)

作者模型中:

public function blogs()
{
    return $this->belongsToMany(Blog::class,'author_blog','author_id','blog_id');
}

author_blog =>中间表

author_id => foreignPivotKey

blog_id => relatedPivotKey