Laravel 8 自定义多态类型
默认情况下, Laravel 使用完全限定类名存储关联模型类型。在上面的一对多示例中, 因为 Comment
可能从属于一个 Post
或一个 Video
,默认的 commentable_type
就将分别是 App\Post
或 App\Video
。不过,你可能希望数据库与应用的内部结构解耦。在这种情况下,可以定义一个「morph 映射」来通知 Eloquent 使用自定义名称代替对应的类名:
use Illuminate\Database\Eloquent\Relations\Relation;
Relation::morphMap([
'posts' => 'App\Models\Post',
'videos' => 'App\Models\Video',
]);
可以在 AppServiceProvider
的 boot
函数中注册 morphMap
,或者创建一个单独的服务提供者。
注意:在现有应用程序中添加「morph 映射」时,数据库中仍包含完全限定类的每个可变形
*_type
列值都需要转换为其「映射」名称。
您可以在运行时使用 getMorphClass
方法确定给定模型的别名。 相反,您可以使用 Relation::getMorphedModel
方法来确定与别名相关联的类名:
use Illuminate\Database\Eloquent\Relations\Relation;
$alias = $post->getMorphClass();
$class = Relation::getMorphedModel($alias);