在数据库中保存morphOne多态

时间:2016-01-23 13:29:08

标签: php mysql laravel polymorphism extends

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

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'和ModuleB应归属于Page。

实现此类课程的最佳方法是什么?

更新:如何保存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") }

2 个答案:

答案 0 :(得分:1)

如果你想扩展'基础'模型/表格,我建议使用Laravel的Polymorphic Relations

你有一个基本模型/表('name','slug','x','y','ref to page','ref to extend')和其他一些扩展数据('power') | '大小' | ...)。

答案 1 :(得分:1)

保存在数据库中

接受的答案对于表格结构是好的,但要保存数据,你需要像这样继续:

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

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

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

文档非常糟糕。