laravel eloquent 中的一对多关系

Posted

技术标签:

【中文标题】laravel eloquent 中的一对多关系【英文标题】:One-To-Many Relationships in laravel eloquent 【发布时间】:2017-04-20 00:04:45 【问题描述】:

早上好,我在 Eloquent 中的模型关系遇到了一点问题,我需要用中间表链接这些文章的文章和图片。在中间表中,我想添加文章和图像的 id,并且我想检索属于一篇文章的所有图像,管理关系的最佳方法是什么?提前致谢

【问题讨论】:

laravel.com/docs/5.3/eloquent-relationships#one-to-many Laravel 有很好的文档记录,如果你阅读了文档,你就不需要问这个了。 一个公司有很多部门如何定义这个任何人的关系?公司表 分公司表 company_id 主键 【参考方案1】:

在图像模型类中

class Image extends Model


    public function article()
    
        return $this->belongsTo(Article::class);
    


然后你就可以访问所有属于Article的图片了。

$image= Image::first();

然后例如当我们想要获取属于Article的图像的名称时。

$imageName = $image->article->name;

【讨论】:

【参考方案2】:

您可以使用morphMany() 关系 (Polymorphic Relationship) 来解决您的问题,如下所示:

UPDATE:表结构如下:

- articles
    - id
    - title
    - content
    - ...

- images
    - id
    - owner_id
    - owner_type (Here there can be - Article, Auction, User, etc)
    - name
    - mime_type
    - ...

多态关系允许一个模型属于多个 单个关联上的其他模型。例如,想象一下用户 您的应用程序可以“评论”帖子和视频。使用 多态关系,您可以使用单个 cmets 表 这两种情况。

您的模型将如下所示:

class Article extends Model


    public function images()
    
        return $this->morphMany(Image::class, 'owner');
    



class Image extends Model


    public function owner()
    
        return $this->morphTo();
    


要将多张图片保存到一篇文章中,您可以这样做:

$article->images()->create([... inputs_arr ...]);

要获取它们,您可以这样做:

$articleImages = Article::find($id)->images;

希望这会有所帮助!

【讨论】:

那么,它是如何保存表中的数据的呢?它在哪里使数据库上的关系?我在制作模型之前创建了数据库,因为我之前使用的是纯 php。谢谢:D 这种情况下将有 2 个表。您的表结构将如我上面更新的答案所示。 如果我使用与其他模型相关的图像表会不会有问题,比如拍卖、用户等? 在这种情况下,您可以使用Polymorphic Relationships,让我更新我的答案... 是的,如果您创建 migrations 那就太好了,因为它可以帮助其他开发人员通过编写单个命令来使他们的数据库正常工作(有助于将数据库迁移到不同类型的数据库,例如 - sql、 sqlite 等)..其他开发人员在处理您的项目时可能会遇到问题,因为他们的数据库因您的代码而异!【参考方案3】:

您不需要使用数据透视表,因为它是 one-to-many 关系。

只需使用hasMany() 关系:

public function images()

    return $this->hasMany('App\Image');

然后使用eager loading 加载所有带有文章的图片:

$article = Article::with('images')->where('id', $articleId)->first();

【讨论】:

这个答案应该被选为最佳答案

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

核心数据 - NSFetchRequestResult:结果中的一对多关系中的项目数?

11-表之间关系

一对多(多对一)关系中的inverse和cascade属性

在 Core Data 中有效地获取一对多关系中的最新记录

获取核心数据对象,其中一对多关系包含集合中的所有对象

Razor Pages - 一对多关系