gpt4 book ai didi

validation - 准则2,Symfony 2中的独特约束

转载 作者:行者123 更新时间:2023-12-03 09:13:25 26 4
gpt4 key购买 nike

我想在我的Doctrine 2实体中设置一个唯一约束,以便nametest在列方面是唯一的。含义

  • obj1
  • 名称:name1
  • 测试:测试
  • obj2
  • 名称:name2
  • 测试:测试<----复制了

  • 由于测试重复,因此应触发错误。

    我尝试使用唯一约束( Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity)。试过了
     * @UniqueEntity("name")
    * @UniqueEntity("test")


     * @UniqueEntity({"name", "test"})

    当我有两个名字和测试重复时,两者似乎都只会触发错误。例如。
  • obj1
  • 名称:name1
  • 测试:测试
  • obj2
  • 名称:name2
  • 测试:测试

  • 什么是正确的设置?或者我可能在某个地方犯了错误?

    也许我应该包括以下教义注释:
    @Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})})

    但这仍然无法处理我认为的symfony表单验证吗?

    更新

    我的测试代码:
    /**
    * @ORM\Entity
    * @ORM\Table(name="roles")
    * @UniqueEntity("name")
    * @UniqueEntity("test")
    */
    class Role {

    /**
    * @var integer
    * @ORM\Column(type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue
    */
    protected $id;

    /**
    * @var string
    *
    * @ORM\Column(type="string", length=32, unique=true)
    * @Assert\MaxLength(32)
    * @Assert\Regex("/^[a-zA-Z0-9_]+$/")
    */
    protected $name;

    }

    $v = $this->get('validator');

    $role = new Role();
    $role->setName('jm');
    $role->setTest('test');
    $e = $v->validate($role);
    echo '=== 1 ===';
    var_dump($e);
    if (count($e) == 0)
    $em->persist($role);

    $role2 = new Role();
    $role2->setName('john');
    $role2->setTest('test');
    $e = $v->validate($role2);
    echo '=== 2 ===';
    var_dump($e);
    if (count($e) == 0)
    $em->persist($role2);

    $em->flush();

    首次运行(空表)时:
    === 1 ===object(Symfony\Component\Validator\ConstraintViolationList)#322 (1) {
    ["violations":protected]=>
    array(0) {
    }
    }
    === 2 ===object(Symfony\Component\Validator\ConstraintViolationList)#289 (1) {
    ["violations":protected]=>
    array(0) {
    }
    }

    但是我在数据库层上确实遇到了关于唯一约束的错误。那么,如何使Validation层正常工作呢?

    最佳答案

    这些分别检查字段:

    @UniqueEntity("name")
    @UniqueEntity("test")

    也就是说,第一个将在存在重复的 name值时触发,而第二个将在存在重复的 test值时触发。

    如果您希望当 nametest包含相同组合时验证失败,请使用以下命令:
    @UniqueEntity({"name", "test"})

    对于您想要的方法,第一种方法应该有效—除非您在其他地方做错了什么。另外,尝试清除缓存以确保不是它的错。

    更新

    我建议的是关于应用程序端的验证部分。如果使用Doctrine生成数据库模式,则需要为每一列提供Doctrine级别的注释-当然,如果要使它们彼此唯一,就可以做到:
    @Column(type = "string", unique = true)
    private $name;

    @Column(type = "string", unique = true)
    private $test;

    这些方法相互补充-不排除。 @UniqueEntity确保重复项甚至不会到达数据库层,而 @Column确保重复项不会到达数据库层。

    关于validation - 准则2,Symfony 2中的独特约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8545561/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com