这就是我在 Eloquent 中制作多表继承的方式:
模型继承的变形,根据我对 Doctrine 的经验,多表中的模型继承被证明是非常低效的
这是我的 morphMap 配置
Relation::morphMap([
2 => Flight::class,
1 => Boat::class
], false);
/* The 'false' as second parameter is to indicate Eloquent that it has to use this map and nothing else, otherwise it will merge this map with what it gets from metadata and make a mess with that. I use this ints for the types because they are FKs of the table with all the types that I use to list in a Drop Down so the user can select what he wants to create */
class Sequence{
/* Second parameter indicates the discriminator column name, that will be the column with the value indicating the type of the sublcass (1:B, 2:C) as mapped in morphMap and the third parameter indicates the key value of the sublcass (not FK_CONSTRAINT because it could be from Class B or C) */
public function sequencable()
{
return $this->morphTo("sequencable","sequencable_type_id", "sequencable_id");
}
}
Class Boat{
public function sequence(){
return $this->morphOne('Models\Sequence','sequencable');
}
}
Class Flight{
public function sequence(){
return $this->morphOne('Models\Sequence','sequencable');
}
}
现在要使用它,我写了如下内容:
$type = 2; //You get this from the request or whatever logic you have
$sequence= new Travel\Sequence()();
$model = $sequence->sequencable()->createModelByType($type);
$model->save();
$sequence->sequencable()->associate($model);
$sequence->save();
createModelByType($type)方法很有用。
序列表如下所示:
//sequencable_type_id indicates the type of the sublcass
//sequencable_id indicates the type of the sublcass
{id,sequencable_type_id, sequencable_id}
子类看起来像这样
{id,column1, column2, etc...}