Eloquent ORM自定义多态关联

kwokwah

Laravel 自定义多态类型

默认情况下, 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',
]);

Webman中实现

实现方法:在 webman 的 业务初始化 自定义多态模型关联。

流程

创建初始化文件

执行命令 php webman make:bootstrap LaravelDbMorphMap 生成初始化文件 app/bootstrap/LaravelDbMorphMap.php

编辑初始化文件

<?php

namespace app\bootstrap;

use Webman\Bootstrap;
use Illuminate\Database\Eloquent\Relations\Relation;

class LaravelDbMorphMap implements Bootstrap
{
    public static function start($worker)
    {
        // Is it console environment ?
        $is_console = !$worker;
        if ($is_console) {
            // If you do not want to execute this in console, just return.
            return;
        }
        Relation::enforceMorphMap([
            'posts' => 'app\model\Post',
            'videos' => 'app\model\Video',
        ]);

    }

}

如果还有更加好的实现办法,欢迎讨论。

222 0 0
0个评论

kwokwah

240
积分
0
获赞数
0
粉丝数
2024-04-03 加入
🔝