stayallive/laravel-inverse-relations

具有反向水合的HasMany、HasOne和MorphMany Eloquent关系。

v1.1.0 2024-04-22 18:31 UTC

This package is auto-updated.

Last update: 2024-09-22 19:16:48 UTC


README

Latest Version Software License Build Status Total Downloads

HasManyHasOneMorphMany Eloquent关系与反向水合。

Jonathan Reinink 写了一篇关于如何在Laravel中优化循环关系的优秀博客文章,请参阅 优化Laravel中的循环关系。该包 stancl/laravel-hasmanywithinverse 基于该想法并实现了hasMany关系。此包通过为hasOnemorphMany关系也实现它来改进这一点。

简而言之,此包允许您在模型上定义反向关系。这意味着您可以在模型上定义一个指向另一个模型的关联。当您在两个模型之间有循环关系并且希望能够访问反向关系而不必从数据库中加载另一个模型时,这非常有用,这可以潜在地节省大量的数据库查询。

安装

composer require stayallive/laravel-inverse-relations

用法

添加HasHasManyWithInverseRelationHasHasOneWithInverseRelation和/或HasMorphManyWithInverseRelation特性将为您提供设置反向关系的辅助方法。

查看测试存根,了解如何将特性应用于模型以设置反向关系的示例

注意事项

由于反向关系通过引用存储父级(而不是克隆),因此在使用关系时需要小心,因为您将修改父级模型。这对于此包来说不是什么新功能,因为预加载也会做同样的事情,但我认为提一下这一点可能会让您防患未然。

由于反向关系作为引用存储,它创建了一个循环引用。这意味着您不能递归序列化具有反向关系的模型。例如,当Laravel将模型传递给队列作业时,Laravel会这样做,因为SerializesModels特性也会尝试存储当模型被排入队列以加载这些关系时加载的关系,以便在作业被处理时加载这些关系。这会导致无限循环,试图递归确定哪些关系被加载,消耗内存,直到操作系统将其终止或崩溃。

为了防止这种情况,您可以使用$model->withoutRelations()将模型传递给作业,或者您可以通过向模型添加以下方法来禁用模型上的关系加载:

    public function getQueueableRelations(): array
    {
        return [];
    }

这禁用了在序列化或反序列化时在模型上收集和加载关系。

我个人将它放在了我的基础模型中,因为我从不想加载在将作业推入队列时加载的关系,因为它们在作业的上下文中大多没有用,除了防止循环引用外,这还可以节省数据库查询(有时很多)检索未使用的关系。

安全漏洞

如果您在此包中发现安全漏洞,请通过电子邮件发送给Alex Bouma,地址为 alex+security@bouma.me。所有安全漏洞都将迅速得到解决。

许可证

此包是开源软件,受MIT许可证的许可。