laravel - 影响其他列的列更改
问题描述
我有下表:
$table->boolean('prop_enabled');
$table->boolean('prop1_enabled')->nullable();
$table->boolean('prop2_enabled')->nullable();
$table->boolean('prop3_enabled')->nullable();
我的要求是 when prop_enabled
is , false
then和values 应在行插入或更新期间设置为。prop1_enabled
prop2_enabled
prop3_enabled
null
我的桌子设计是否适合解决问题?如果我的表很好地解决了问题,哪种方法更好地处理我的要求?我可以选择在数据库上创建触发器,或者从类中覆盖Create
和save
方法。Model
解决方案
我相信最好的方法是做观察者解决方案。使用 mutator 需要大量的 mutator 来保护可以忽略它的数据结构和/或业务逻辑。观察者正在使用事件,你只能通过避免使用 eloquent 来规避它的触发。
您可以挂钩到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. 道具会发生什么,你将如何处理显示它们和更新它们?另一种方法是将 em 以更通用的方式放在另一个表中,当它们具有名称或键而不是 prop1 或 prop2 并且具有与创建它们或更新 em 相关联的逻辑时。如果你确定 prop1、prop2 和 prop3 不会改变设计,那么现在就可以了。
推荐阅读
- python - 如何在 Python 中使用扩展运算符
- ios - rx.sentMessage(#selector(UIViewController.viewDidLoad)) 没有触发
- rxjs - 添加到先前合并的 Observable
- android - 如何修复“android.arch.lifecycle:runtime”在 Flutter 中的编译时和运行时版本不同?
- wpf - WPF 弹出控件正在立即关闭
- regex - 如何使用 REGEX 检查字符串是否仅以特定值结尾
- html - How to control position overlap on other elements?
- javascript - 通过 Discord OAuth 传递字符串?
- c# - 即使条件保持为真,如何只运行一次进程
- perl - 在 Perl foreach 循环中分配两个变量