2016-01-23 35 views
1

使用Laravel 5,我得到了一个模块类(一个Eloquent模型)。我想为许多类型的模块创建子类:moduleA,moduleB等。每个子模块都有特定的属性和主模块类自己的通用属性。一个模块属于一个页面。在数据库中保存morphOne多态

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']; 
    /*...*/ 
} 

在数据库中,子模块应具有所有模块属性和子模块属性。模块B的例子:'name','slug','x','y','size'和ModuleB应该属于一个Page。

实现这种类的最好方法是什么?

Updade:我该如何保存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()不存储模块和ModuleA的DATAS(只时间戳):

$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") } 

回答

1

如果你想扩展一个 '基地' 的模式/表我建议使用Laravel的Polymorphic Relations。你有一个基本模型/表('name','slug','x','y','ref to page','ref to extend')和其他一些扩展数据('power '|' 大小'| ...)。

+0

它的工作原理!但是模块表是空的吗?只有ModuleA表填充所有数据(我正在使用mongodb) – Ludovic

+0

要解决保存问题,请看下面的答案 – Ludovic

1

要在数据库保存

接受的答案是很好的一个表结构,而是拯救你需要这样进行DATAS:

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

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

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

文件是关于很差。