0

我正在使用 laravel 5.2。我的应用程序中有许多模型,即用户、律师、经理等。

我正在从基本用户模型扩展律师和经理模型。

    class LawyerController extends Controller
{
    //

    public function index()
    {
        $lawyer = Lawyer::findOrFail(1);
        return $lawyer->name;
    }
}

return 语句正在发送 null。

该行不应该$lawyer->name从基类中选择名称吗?那里有什么问题?是否可以以这种方式进行多表继承?

4

1 回答 1

0

这就是我在 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...}
于 2016-06-30T14:22:45.930 回答