在数据库中保存 morphOne 多态

Save morphOne polymorphic in database

使用 Laravel 5,我得到了一个模块 class(一个 Eloquent 模型)。我想为多种模块创建 subclasses:moduleA、moduleB 等。每个子模块都有特定的属性,主模块 class 有自己的通用属性。一个模块属于一个页面。

class Module extends Eloquent {

    protected $fillable = ['name', 'slug', 'x', 'y'];

    /*...*/

    public function page()
    {
        return $this->belongsTo('App\Models\Page');
    }
}

class ModuleA extends Module {
    protected $fillable = ['power'];
    /*...*/
}

class ModuleB extends Module {
    protected $fillable = ['size'];
    /*...*/
}

在数据库中,SubModules 应具有所有 Module 属性和 SubModules 属性。模块 B 的示例:'name'、'slug'、'x'、'y'、'size' 并且模块 B 应该属于一个页面。

实现这种 classes 的最佳方法是什么?

更新:我怎样才能保存 MySQL 中的所有内容?

class Module extends Eloquent {

    protected $fillable = ['name', 'slug', 'x', 'y'];

    /*...*/

    public function page()
    {
        return $this->belongsTo('App\Models\Page');
    }
   public function modulable()
   {
        return $this->morphTo();
   }
}

class ModuleA extends Module {
    protected $fillable = ['power'];
    public function module()
    {
        return $this->morphOne('App\Models\Module', 'modulable');
    }
}

做一个简单的 $module.save() 不存储 Module 和 ModuleA 的数据(仅时间戳):

$module = new ModuleA();
$m->save(); // 

> db.module_navs_collection.find();
{ "_id" : ObjectId("56a4a4c6bffebcec068b456a"), "updated_at" : ISODate("2016-01-24T10:17:42.097Z"), "created_at" : ISODate("2016-01-24T10:17:42.097Z") }

如果要扩展 'base' model/table 我建议使用 Laravel 的 Polymorphic Relations

你有一个基地model/table ('name', 'slug', 'x', 'y','ref to page', 'ref to extend' ) 和其他一些具有扩展数据 ('power'|'size'|...)。

保存到数据库

接受的答案是 table 结构的好答案,但要保存数据,您需要像这样进行:

$module = new Module();
$module->name = "Generator";
$module->save();

$moduleA = new ModuleA();
$moduleA->power = "120v";
$moduleA->save();

$moduleA->module()->save($module);

这方面的文档很差。