首页 > 解决方案 > 仅对 Laravel 集合中的记录子集的急切加载关系

问题描述

我正在开发一个遗留的 Zend 1 项目,该项目正在通过 Strangler 模式迁移到 Laravel,并且我正在使用 Eloquent 进行一些数据库查询(尽管不是全部,因为它们仍在迁移过程中)。因为 Zend 1 不能在高于 7.1 的任何 PHP 版本上运行,所以它停留在 Laravel 5.8 的 Eloquent 版本上,直到另行通知。

我有一个包含导航项的特定表,该表具有内容项的可为空的多态关系,该关系使用变形图将 Eloquent 模型映射到项类型。一种类型static没有分配 Eloquent 模型,因为它只是其他导航项的容器。尝试在具有该static类型的任何项目上急切加载关系会破坏它,因为它没有在变形图中定义,并且将其设置为 null 也不能解决问题。

现在我static在单独的查询中加载链接类型为的项目,并将它们与获取剩余导航项目的查询合并,但这意味着有两个单独的查询,这对性能不利。使用联合并不能解决问题,因为急切加载是与导航项的查询不同的查询。

我知道可以load()在已经通过查询检索到集合之后调用集合以预先加载关系,并且还可以限制预先加载,例如,可以在加载时应用 WHERE 子句关系。我试图找到的是一种确保查询仅在项目类型不是时才尝试急切加载关系的方法static。换句话说,不限制查询以获取关系,而是从查询中排除该记录,因此不会尝试检索该记录的不存在关系。

有谁知道这是否可能?我能想到的一种解决方案是将集合中非静态的项目拆分并应用load()到那里,但这相当麻烦,我希望有一种更优雅的方法。

标签: laraveleloquentlaravel-5.8

解决方案


推荐阅读