从某些日子开始,我与我的一个实体有一个问题。 此实体的ID可以手动定义(无自动增量)。但是当我尝试定义它时,Doctrine会在插入到查询中返回错误:
DBALException:执行'INSERT INTO InfosPerso(num,login,nom,prenom,email,societe,adr1,adr2,cp,ville,tel,fax,nichandle,parrain,actif,state,emailvalide,date_creation)时发生异常,id_entite_legale_pays,支付)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'与params [null,“测试”,“Hebert”,“Donovan”,“test@mail.com”,“SNCF”,“Tempore excepteur nulla molestiae sed temporibus eum officia error illo tempore et amet voluptatum vel modi cupiditate”,“Laboriosam eiusmod” dolor non saepe incidunt cillum corrupti occaecat dolorem tempore aut quis esse autem“,”13001“,”Marseille“,”0442910000“,”0442499569“,0,null,1,0,1,”2015-06-04 11:09 :46.000“,null,171]:
SQLSTATE [HY000]:常规错误:515常规SQL Server错误:检查来自SQL Server的消息[515](严重级16)[(null)]
这是我目前的代码:
$infosPerso = new InfosPerso();
$infosPerso->setLogin($client->getLogin())
->setParrain($leaderBmcId)
->setNicHandle(0)
->setNom($client->getName())
->setPrenom($client->getFirstname())
->setEmail($client->getEmail())
->setAdr1($client->getAddress())
->setAdr2($client->getComplementaryAddress())
->setCp($client->getZipCode())
->setDateCreation($client->getCreationDate())
->setTel($client->getPhone())
->setFax($client->getFax())
->setVille($client->getCity())
->setPays($client->getCountry())// Entity Pays
->setSociete($client->getCompany()->getLibCompanies())
->setEmailValide(true)
->setState(0)
->setActif(1);
ID的实体定义:
/**
* @var integer $num
*
* @ORM\Column(name="num", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class="BizDatasBundle\Database\BMC\InfosPersoIdGenerator")
*/
private $num;
InfosPersoIdGenerator类定义如下:
<?php
namespace BizDatasBundle\Database\BMC;
use Doctrine\ORM\Id\AbstractIdGenerator;
class InfosPersoIdGenerator extends AbstractIdGenerator
{
public function generate(\Doctrine\ORM\EntityManager $em, $entity)
{
$maxId = $em->createQueryBuilder('ip')
->select('MAX(ip.num)')
->from('BizDatasBundle:BMC\\InfosPerso', 'ip')
->getQuery()
->getSingleScalarResult();
$maxId++;
return $maxId;
}
}
如果我对$maxId
进行回音,它将打印正确的ID进行设置。
但是当Doctrine刷新时,查询中的ID设置为NULL
,我找不到原因。
如果你有个主意。 谢谢!
答案 0 :(得分:0)
好的,让我们看看:
您说转储$maxId
会返回正确的值,但如果仔细查看您提供的代码,实际上并未将值设置为InfosPerso
。您更有可能错过->setNum( $maxId )
。
顺便说一下,你可以在SQL Query中清楚地看到:
INSERT INTO InfosPerso (num...) // and the rest of your columns here
之后:
with params [null,...]
如您所见,您没有为该列提供值。
最后一点,如果您要自己生成ID,可以删除GeneratedValue
注释。引自documentation:
NONE:告诉Doctrine标识符由您的代码分配(并由此生成)。必须在将新实体传递给EntityManager#persist之前进行分配。 NONE与完全不使用@GeneratedValue相同。