我需要一个具有OneToOne或OneToMany多态关系定义的其他特定模型的所有模型的类名列表。此列表不能基于对应数据库表中实际存在的关系,而必须基于代码定义。
示例
类A、B和C与类X( *able类)具有一对一或一对多的多态关系。
我在寻找(现有的?)方法检索A、B和C的类名(或与X关系相同的任何其他类)。
发布于 2021-06-28 12:05:16
MorphOne关系的逆,是MorphTo关系。然而,有了雄辩的口才,这种关系并没有定义所有与自身有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;
});这是一个不那么简单但更精确的解决方案,它将始终与实际实现同步。不过,您需要缓存此方法的执行,因为在应用程序中(通过遍历文件系统)查找所有模型可能是一项昂贵的任务。
https://stackoverflow.com/questions/68160166
复制相似问题