Laravel 8 自定义多态类型

2021-07-19 11:39 更新

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

use Illuminate\Database\Eloquent\Relations\Relation;

Relation::morphMap([
    'posts' => 'App\Models\Post',
    'videos' => 'App\Models\Video',
]); 

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

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

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

use Illuminate\Database\Eloquent\Relations\Relation;

$alias = $post->getMorphClass();

$class = Relation::getMorphedModel($alias); 
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号