我知道有很多这样的问题。但是,没有一个答案似乎适合我的情况......
我有一个MySQL表,如下所示:
DROP TABLE IF EXISTS personen;
CREATE TABLE personen
(id INTEGER NOT NULL AUTO_INCREMENT,
famname VARCHAR (70) NOT NULL default ' ',
vorname VARCHAR (30) NOT NULL default ' ',
titel VARCHAR (50) NOT NULL default ' ',
titel2 VARCHAR (50) NOT NULL default ' ',
titel3 VARCHAR (50) NOT NULL default ' ',
geschlecht INTEGER NOT NULL default 1,
anrede2 VARCHAR (100) NOT NULL default ' ',
bemerkung VARCHAR (191) NOT NULL default ' ',
PRIMARY KEY (id),
UNIQUE KEY `famname` (`famname`,`vorname`),
FOREIGN KEY (`geschlecht`) REFERENCES `cdGeschlecht` (`id`),
FOREIGN KEY (`formell`) REFERENCES `cdFormellInformell` (`id`)
)
DEFAULT CHARACTER SET utf8mb4 COLLATE=utf8mb4_unicode_ci ENGINE=InnoDB
我在Symfony4中使用此表来存储具有许多字段的e“Personen”实体的数据。唯一键在实体中正确定义。在我的“PersonenController”中,我有如下所示的代码。基本上,如果数据库中尚不存在新人,则应该插入新人。但是,当输入已经存在的人的数据时,我得到上面的错误消息,即使 - 至少我认为我指定的 - 这不应该发生。可能是我的查询不正确(我发现expr()函数的用法有些异乎寻常!)。如果错误地指定了所需的结果,即使该人已经存在,它当然可以返回“null”。 有任何想法吗?提前谢谢。
// ...
$person = new Personen();
$personTest = new Personen();
$em = $this->getDoctrine()->getManager();
// get / display formType
$form = $this->createForm(PersonenType::class, $person,
array('entityManager' => $em,));
// when form is submitted...
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// existiert die Person schon in der DB?
// creating a QueryBuilder instance
$qb = $em->createQueryBuilder();
$qb->select('p')
->from('App\Entity\Personen', 'p')
->where($qb->expr()->andX(
$qb->expr()->eq('p.famname', ':familyname'),
$qb->expr()->eq('p.vorname', ':firstname')
))
->setParameters(array('familyname' => '$famname',
'firstname' => '$vorname',));
// retrieve the query from Querybuilder
$query = $qb->getQuery();
// Execute Query
$personTest = $query->getOneOrNullResult();
// does the person already exist in the DB?
if (!$personTest) {
$em->persist($person);
$em->flush();
$this->addFlash('notice', 'Person in DB gespeichert');
}
// Person exists already...
else {
$this->addFlash('notice', 'Person '.$famname.' '.$vorname.' '.'existiert schon in der Datenbank');
}
$nextAction = 'person_neu';
return $this->redirectToRoute($nextAction);
}