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

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

【问题讨论】:

标签: php laravel eloquent one-to-many relationships


【解决方案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();
    

    【讨论】:

    • 这个答案应该被选为最佳答案
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 2021-04-21
    • 2019-06-13
    • 2019-03-26
    • 2013-05-15
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多