8

几天来,我在 Doctrine 实体上遇到了一些小问题。我在两个字段上使用 UniqueConstraint 定义了它,之后在这两个字段上使用 UniqueEntity Validation。但是在通过添加已经在基础中的实体来验证我的表单之后,无法在我的表单中获取我的错误消息。

只是来自 Symfony 的一条错误消息:

SQLSTATE [23000]:完整性约束违规:1062 键 'SIRET' 的重复条目 '339057986-00012'

这是我的实体声明,对我来说一切都很好,但也许我忘记或误解了什么?

<?php

namespace Proetco\FrontBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Proetco\FrontBundle\Entity\Entreprise
 *
 * @ORM\Table(name="entreprise", uniqueConstraints={@ORM\UniqueConstraint(name="SIRET", columns={"SIREN", "NIC"})}) 
 * @ORM\Entity(repositoryClass="Proetco\FrontBundle\Entity\EntrepriseRepository")
 * @UniqueEntity(fields={"SIREN","NIC"}, message="Cette entreprise est déjà enregistrée")
 */
class Entreprise {

protected $Siret;

/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string $SIREN
 *
 * @ORM\Column(name="SIREN", type="string", length=9)
 */
private $SIREN;

/**
 * @var string $NIC
 *
 * @ORM\Column(name="NIC", type="string", length=5)
 */
private $NIC;

/**
 * @var string $RS
 *
 * @ORM\Column(name="RS", type="string", length=45, nullable=true)
 */
private $RS;

/**
 * @var string $NCOM
 *
 * @ORM\Column(name="NCOM", type="string", length=45, nullable=true)
 */
private $NCOM;

/**
 * @var string $CPOS
 *
 * @ORM\Column(name="CPOS", type="string", length=5, nullable=true)
 */
private $CPOS;

/**
 * @var string $LCOM
 *
 * @ORM\Column(name="LCOM", type="string", length=45, nullable=true)
 */
private $LCOM;

/**
 * @var string $INSEE
 *
 * @ORM\Column(name="INSEE", type="string", length=5, nullable=true, nullable=true)
 */
private $INSEE;

/**
 * @var string $DEP
 *
 * @ORM\Column(name="DEP", type="string", length=2)
 */
private $DEP;

/**
 * @var string $ARR
 *
 * @ORM\Column(name="ARR", type="string", length=1, nullable=true)
 */
private $ARR;

/**
 * @var string $CAN
 *
 * @ORM\Column(name="CAN", type="string", length=2, nullable=true)
 */
private $CAN;

public function getSiret()
{
    return $this->Siret;
}

public function setSiret($Siret)
{
    $this->Siret = $Siret;
}

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set SIREN
 *
 * @param string $sIREN
 */
public function setSIREN($sIREN)
{
    $this->SIREN = $sIREN;
}

/**
 * Get SIREN
 *
 * @return string 
 */
public function getSIREN()
{
    return $this->SIREN;
}

/**
 * Set NIC
 *
 * @param string $nIC
 */
public function setNIC($nIC)
{
    $this->NIC = $nIC;
}

/**
 * Get NIC
 *
 * @return string 
 */
public function getNIC()
{
    return $this->NIC;
}

/**
 * Set RS
 *
 * @param string $rS
 */
public function setRS($rS)
{
    $this->RS = $rS;
}

/**
 * Get RS
 *
 * @return string 
 */
public function getRS()
{
    return $this->RS;
}

/**
 * Set NCOM
 *
 * @param string $nCOM
 */
public function setNCOM($nCOM)
{
    $this->NCOM = $nCOM;
}

/**
 * Get NCOM
 *
 * @return string 
 */
public function getNCOM()
{
    return $this->NCOM;
}

/**
 * Set CPOS
 *
 * @param string $cPOS
 */
public function setCPOS($cPOS)
{
    $this->CPOS = $cPOS;
}

/**
 * Get CPOS
 *
 * @return string 
 */
public function getCPOS()
{
    return $this->CPOS;
}

/**
 * Set LCOM
 *
 * @param string $lCOM
 */
public function setLCOM($lCOM)
{
    $this->LCOM = $lCOM;
}

/**
 * Get LCOM
 *
 * @return string 
 */
public function getLCOM()
{
    return $this->LCOM;
}

/**
 * Set INSEE
 *
 * @param string $iNSEE
 */
public function setINSEE($iNSEE)
{
    $this->INSEE = $iNSEE;
}

/**
 * Get INSEE
 *
 * @return string 
 */
public function getINSEE()
{
    return $this->INSEE;
}

/**
 * Set DEP
 *
 * @param string $dEP
 */
public function setDEP($dEP)
{
    if (!isset($this->DEP))
        $this->DEP = '02';
    $this->DEP = $dEP;
}

/**
 * Get DEP
 *
 * @return string 
 */
public function getDEP()
{
    if (!isset($this->DEP))
        $this->DEP = '02';
    return $this->DEP;
}

/**
 * Set ARR
 *
 * @param string $aRR
 */
public function setARR($aRR)
{
    $this->ARR = $aRR;
}

/**
 * Get ARR
 *
 * @return string 
 */
public function getARR()
{
    return $this->ARR;
}

/**
 * Set CAN
 *
 * @param string $cAN
 */
public function setCAN($cAN)
{
    $this->CAN = $cAN;
}

/**
 * Get CAN
 *
 * @return string 
 */
public function getCAN()
{
    return $this->CAN;
}

public function retrieveSiren($siret)
{
    return substr($siret, 0, 9);
}

public function retrieveNic($siret)
{
    return substr($siret, -5, 5);
}

//contraintes de validation
//TODO : valider les champs avec Regex

public function isSIREN()
{

}

public function isNIC()
{

}

}
4

3 回答 3

7

在这里回复为时已晚,但仍然回复,以便可以帮助遇到同样问题的其他人。

两件事情


简答

问题中的实体定义看起来不错,我认为可能存在以下两个问题。

  • 您添加了fields={"SIREN","NIC"}这意味着它们将共同唯一,但您可能希望它们单独唯一
  • 或者您可能没有验证实体,我认为这不太可能,但我仍然想接受检查 https://symfony.com/doc/current/validation.html#using-the-validator-service

下面详细解释

请注意,我摆脱了, uniqueConstraints={@ORM\UniqueConstraint(name="SIRET", columns={"SIREN", "NIC"})}注释@ORM/Table(因为除非您想从实体中生成模式定义,否则不需要 UniqueConstraint)

<?php

namespace Proetco\FrontBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Proetco\FrontBundle\Entity\Entreprise
 *
 * @ORM\Table(name="entreprise") 
 * @ORM\Entity(repositoryClass="Proetco\FrontBundle\Entity\EntrepriseRepository")
 * @UniqueEntity(fields={"SIREN","NIC"}, message="Cette entreprise est déjà enregistrée")
 */
class Entreprise {
    /**
     * Body of entity
     */
}

这也fields={"SIREN","NIC"}意味着您希望这两个列一起是唯一的如果您希望它们中的每一个都是唯一的,那么您将需要两个UniqueEntity

像下面的东西

/**
 * @ORM\Table(name="entreprise") 
 * @ORM\Entity(repositoryClass="Proetco\FrontBundle\Entity\EntrepriseRepository")
 * @UniqueEntity(fields={"SIREN"}, message="Cette entreprise est déjà enregistrée")
 * @UniqueEntity(fields={"NIC"}, message="Cette entreprise est déjà enregistrée")
 */

完成上述设置后,您需要验证实体并处理表单中的错误

于 2017-10-06T09:13:58.577 回答
-1

Why not putting unique=true?
Like that :

/**
 * @var string $SIREN
 *
 * @ORM\Column(name="SIREN", type="string", length=9,unique=true)
 */
private $SIREN;

/**
 * @var string $NIC
 *
 * @ORM\Column(name="NIC", type="string", length=5,unique=true)
 */
private $NIC;
于 2012-08-23T15:34:33.163 回答
-1

并且添加“unique=true”不允许正确捕获错误。我有同样的问题。如果我找到原因,我会回来告诉它。也许它会帮助某人......

编辑:(现在是答案)。我看到了很多帖子,但我没有找到任何好的解决方案。这似乎是一个错误:https ://groups.google.com/forum/#!topic/symfony2/veb6Leph2_w

所以我使用了相同的解决方案:try/catch。我只需要假设数据库抛出的唯一异常是违反唯一约束...

// ...
try {
 $this->persistAndFlush($user);

 return $this->redirect($this->generateUrl('publish'));
}
catch (\PDOException $e) {
 $error = $this->trans('user.username.notUnique',array(),'validators');
}
// ...

这并不令人满意,但它确实有效。今天我为此浪费了足够的时间。

对 vegemite4me 的回答:抱歉,我不熟悉 Stackoverflow。我没有找到“评论”按钮,而现在,我唯一能看到的就是回复你的那个。但它不起作用......要么我不走运,要么我是一个菜鸟,或者表格做得非常非常糟糕。应该是这三个

于 2013-11-18T11:11:15.997 回答