我有下表:
$table->boolean('prop_enabled');
$table->boolean('prop1_enabled')->nullable();
$table->boolean('prop2_enabled')->nullable();
$table->boolean('prop3_enabled')->nullable();
我的要求是,当prop_enabled
为false
时,则在行插入期间应将prop1_enabled
,prop2_enabled
和prop3_enabled
的值设置为null
或更新。
我的餐桌设计是否适合解决问题?
如果我的桌子可以很好地解决问题,哪种方法可以更好地满足我的要求?我可以选择在数据库上创建触发器,或覆盖Create
类中的save
和Model
方法。
答案 0 :(得分:0)
我认为最好的方法是使用Observer解决方案。使用一个转换器,需要很多转换器来保护您的数据结构和/或可以忽略它的业务逻辑。观察者正在使用事件,因此您只能通过避免使用口才来避免触发它。
您可以加入模型上的saving
事件。这将在保存模型之前先对其进行查看,如果情况属实,则对其进行更改,从而创建最佳的1条查询插入。无论您的业务逻辑如何,这都会在创建或更新之前触发。
class YourModelObserver {
public function saving(YourModel $model) {
if ($model->prop_enabled === false) {
$model->prop1_enabled = false;
$model->prop2_enabled = false;
$model->prop3_enabled = false;
}
}
}
在提供者中,您必须注册您的侦听器。
public function boot()
{
YourModel::observe(YourModelObserver::class);
}
我的设计最大的问题是我以前见过的常见代码异味。当您有多个倍数时,将变量命名为数字似乎对我来说是错误的。如果您获得了4. prop,将会发生什么?如何显示它们并更新em?一种替代方法是,当它们具有名称或键而不是prop1或prop2并具有与创建或更新em相关的逻辑时,在另一个表中以更通用的方式获取em。如果您确定prop1,prop2和prop3不会改变,那么目前的设计是好的。