如何解决Laravel 8:获取特定关系的“morphOne”类的所有模型的类名
我需要一个所有模型的类名列表,这些模型具有到另一个特定模型的 OneToOne 或 OneToMany 多态关系定义。这个列表一定不是基于对应数据库表中实际存在的关系,而是基于代码定义。
示例
A、B 和 C 类与 X 类(*able 类)具有多态的一对一或一对多关系。
我正在搜索(现有的?)方法来检索 A、B 和 C(或与 X 具有相同关系的任何其他类)的类名。
解决方法
MorphOne
关系的逆是 MorphTo
关系。但是,对于 Eloquent,这种关系并没有定义与自身具有 MorphOne
关系的所有模型。
解决方案 A
一个简单的解决方案是在 X
类上记录一个静态数组,该类包含该关系的所有可能的类,就像这样。
class X extends Model
{
public static array RELATION_OPTIONS = [
App\A::class,App\B::class,App\C::class,];
public function foo(): MorphTo
{
return $this->morphTo();
}
}
此解决方案的缺点是您必须使模型选项数组与逆关系的实际实现保持同步。因此,每当您添加另一个与 MorphOne
具有 X
关系的模型时,您都需要将其添加到 RELATION_OPTIONS
数组中。
方案 B
另一种解决方案是利用循环遍历所有 Models
来确定它们中的哪些与 X
有关系。在伪代码中,这意味着您将不得不这样做:
$models = get_all_models(); // \Illuminate\Support\Collection
$models->filter(function (Model $model) {
if ( ! method_exists($model,'foo')) return false;
$relation = $model->foo();
if ( ! $relation instanceof MorphOne) return false;
return $relation->getParent() instanceof X;
});
这是一个不那么简单但更准确的解决方案,它将始终与实际实施保持同步。不过请注意,您需要缓存此方法的执行,因为查找应用程序中的所有模型(通过在文件系统上循环)可能是一项昂贵的任务。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。