在symfony4下将实体持久保存到mysql(重复键)

时间:2018-02-28 17:21:37

标签: php symfony insert on-duplicate-key

我知道有很多这样的问题。但是,没有一个答案似乎适合我的情况......

我有一个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);
    }

0 个答案:

没有答案