阅读(4613) (5)

Laravel 8 自定义多态类型

2021-07-08 09:44:43 更新

默认情况下, Laravel 使用完全限定类名存储关联模型类型。在上面的一对多示例中, 因为 Comment 可能从属于一个 Post 或一个 Video,默认的 commentable_type 就将分别是 AppPostAppVideo。不过,你可能希望数据库与应用的内部结构解耦。在这种情况下,可以定义一个「morph 映射」来通知 Eloquent 使用自定义名称代替对应的类名:

use IlluminateDatabaseEloquentRelationsRelation;

Relation::morphMap([
    'posts' => 'AppModelsPost',
    'videos' => 'AppModelsVideo',
]); 

可以在 AppServiceProviderboot 函数中注册 morphMap,或者创建一个单独的服务提供者。

注意:在现有应用程序中添加「morph 映射」时,数据库中仍包含完全限定类的每个可变形 *_type 列值都需要转换为其「映射」名称。

您可以在运行时使用 getMorphClass 方法确定给定模型的别名。 相反,您可以使用 Relation::getMorphedModel 方法来确定与别名相关联的类名:

use IlluminateDatabaseEloquentRelationsRelation;

$alias = $post->getMorphClass();

$class = Relation::getMorphedModel($alias);