Laravel 5.5中的一对多关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 5.5中的一对多关系相关的知识,希望对你有一定的参考价值。

我在Laravel 5.5中遇到了一对多的关系。

我有两个表,一个用于博客帖子,一个用于作者。 posts表有一个author_id列,并且每个博客帖子都填充了有效的作者ID。 author_id被定义为posts表迁移中的外键。

当我加载使用查询的视图时,作者为null,因为author_id未包含在生成的查询中。

发布模型:

public function author(): BelongsTo
{
    return $this->belongsTo(Author::class);
}

我也尝试明确列出具有相同结果的键:

return $this->belongsTo(Author::class, 'author_id', 'id');

发布存储库:

public function getPostBySlug(string $slug)
{
    return $this->model
        ->select(
            'posts.title',
            'posts.contents',
            'posts.published_at'
        )
        ->with(['author:first_name,last_name,slug'])
        ->where('posts.slug', '=', $slug)
        ->whereNotNull('posts.published_at')
        ->first();
}

生成的查询:

select `first_name`, `last_name`, `slug` 
from `authors` where `authors`.`id` in ('') 
and `authors`.`deleted_at` is null
答案

你没有选择posts.author_id所以如果没有author_id无法建立关系,可以选择*或排除select语句或在select语句中包含posts.author_id,例如:

$this->model
    ->select(
        'posts.author_id',
        'posts.title',
        'posts.contents',
        'posts.published_at'
    )
    // rest of the code ...

foreign key (posts.author_id)必须与authors建立关系。

另一答案

试试这个

$users = DB::table('posts')
        ->leftJoin('authors', 'authors.id', '=', 'posts.user_id')
        ->select('posts.author_id','posts.title','posts.contents','posts.published_at',
               'authors.first_name','authors.last_name','authors.slug')
        ->where('posts.slug', '=', $slug)
        ->whereNotNull('posts.published_at')
        ->first();
另一答案

以下列方式托盘关系:

return $this->belongsTo('namespaceauthor');

或逆转方式

return $this->hasMany('namespaceauthor');

以上是关于Laravel 5.5中的一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

无法删除一对多关系中的记录 laravel eloquent

laravel 4中的一对多关系帮助

laravel eloquent 中的一对多关系

如何在 php Laravel 中的两个表之间创建一对多关系?

Laravel 5.4雄辩的一对多关系

Laravel 一对多关系结果