【问题标题】:inactive db fields if one of them is set to true php如果其中之一设置为 true php,则为非活动数据库字段
【发布时间】:2018-12-06 06:03:00
【问题描述】:

如果其中一个设置为 true,是否有办法自动将其他数据库字段设置为 false?

例如:

User
----

admin
is_super_admin
is_coach_admin

用户只能是上述值之一。如果我将管理员设置为 true,我希望将 is_super_admin 和 is_coach_admin 自动设置为 false。我的意思是,不要在后端设置。有办法吗?至少,最适合 symfony 学说:)

【问题讨论】:

  • 您可以为数据库中的字段定义默认值。将所有设置为 false (0)。
  • 是的,但我的意思是,如果我将管理员设置为 true,则无法将 is_super_admin 或 is_coach_admin 字段设置为 true。有这样的方法吗?将这些值相互依赖?
  • 你想在前端做吗?我的意思是,当一个复选框被设置时,另一个应该被禁用?
  • 您可以在更新表时使用代码轻松完成此操作,或者您可以在 MySQL 中为处理它的表创建一个 trigger
  • 是的。我建议您创建一个包含角色的“角色”表。然后,您只需在用户上设置角色的 ID。然后,用户将无法拥有多个角色,并且如果您添加更多角色,则无需更改表。但是,我会考虑为此使用一些库,因为您可能会意识到您还需要组、对访问权限的细粒度控制等,这很快就会变得非常复杂。

标签: php database symfony


【解决方案1】:

您可以通过 Symfony 表达式来验证您的业务逻辑(如果一个值为真,其他值应该为假):

https://symfony.com/doc/3.4/reference/constraints/Expression.html

# src/AppBundle/Resources/config/validation.yml
AppBundle\Model\User:
    properties:
        isAdmin:
            - Expression:
                expression: "this.isSuperAdmin() == false"
                message: "Admin cannot be a super admin also"

但是如果你的意思是根据另一个字段设置一个字段的值,可以使用 Symfony 事件。

   $builder->addEventListener(
        FormEvents::SUBMIT,
        function(FormEvent $event) {
            $form = $event->getForm(); 
            $data = $event->getData();             

            if ($data->isAdmin()){
                $form->get('is_super_admin')->setData(false);
                $form->get('is_coach_admin')->setData(false);
            }
        }
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多