首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 8:获取特定关系的"morphOne“类的所有模型的类名

Laravel 8:获取特定关系的"morphOne“类的所有模型的类名
EN

Stack Overflow用户
提问于 2021-06-28 08:37:54
回答 1查看 456关注 0票数 0

我需要一个具有OneToOne或OneToMany多态关系定义的其他特定模型的所有模型的类名列表。此列表不能基于对应数据库表中实际存在的关系,而必须基于代码定义。

示例

类A、B和C与类X( *able类)具有一对一或一对多的多态关系。

我在寻找(现有的?)方法检索A、B和C的类名(或与X关系相同的任何其他类)。

EN

回答 1

Stack Overflow用户

发布于 2021-06-28 12:05:16

MorphOne关系的逆,是MorphTo关系。然而,有了雄辩的口才,这种关系并没有定义所有与自身有MorphOne关系的模型。

解A

一个简单的解决方案是在X类上记录一个静态数组,该类保存了该关系的所有可能的类,如下所示。

代码语言:javascript
复制
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有关系。在伪代码中,这意味着您必须这样做:

代码语言:javascript
复制
$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;
});

这是一个不那么简单但更精确的解决方案,它将始终与实际实现同步。不过,您需要缓存此方法的执行,因为在应用程序中(通过遍历文件系统)查找所有模型可能是一项昂贵的任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68160166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档