在数据库中保存 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);
这方面的文档很差。
使用 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);
这方面的文档很差。