我在Doctrine实体上遇到了一些问题。我在两个字段上使用UniqueConstraint定义了它,之后在这两个字段上进行了UniqueEntity验证。但是在通过添加已经在base中的实体来验证我的表单之后,无法在我的表单中获取我的错误消息。
来自Symfony的错误消息:
SQLSTATE [23000]:完整性约束违规:1062重复条目'339057986-00012'用于键'SIRET'
这是我的实体声明,对我来说似乎都很好,但也许我忘了或误解了什么?
<?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()
{
}
}
答案 0 :(得分:2)
现在回复已经太迟了,但仍在回复,这样可以帮助那些遇到同样问题的人。
问题中的实体定义看起来很好,我认为可能存在以下两个问题之一。
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")
*/
完成上述设置后,您需要验证实体并处理表单中的错误
答案 1 :(得分:0)
为什么不放unique=true
?
像那样:
/**
* @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;
答案 2 :(得分:-1)
添加“unique = true”不允许正确捕获错误。我有同样的问题。如果我找到原因,我会回来告诉它。也许它会帮助别人......
编辑:(现在是答案)。 我看到帖子的loooooot,我没有找到任何好的解决方案。 这似乎是一个错误: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。我没有找到“评论”按钮,现在,我能看到的唯一一个就是回答你的人。但它不起作用......要么我运气不好,要么我是一个菜鸟,或者形式非常糟糕。可能是三个