默认情况下, 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 的 业务初始化 自定义多态模型关联。
执行命令 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',
]);
}
}
如果还有更加好的实现办法,欢迎讨论。
赞一个