Symfony2创建和持久化实体关系

时间:2015-06-22 13:54:53

标签: php mysql symfony doctrine-orm

我有两个实体SkinEmail。我希望Email成为Skin实体的一部分,但我现在无法使用控制台自动更新架构,这可能就是我无法让关系工作的原因。

所以我想将所有电子邮件存储在电子邮件实体中,并且我想将电子邮件分配给所需的皮肤。所以这种关系应该是OneToOne。

我不是MySQL关系方面的专家,所以这就是我自己制作的:

在我的主Skin课程中,我创建了一个字段,我想在其中存储电子邮件ID:

/**
 *
 * @ORM\OneToOne(targetEntity="MediaparkLt\UserBundle\Entity\Email", inversedBy="skin")
 * @ORM\JoinColumn(name="email_id", referencedColumnName="id")
 */
protected $email_id;

在Email类中,我创建了一个皮肤字段,我想在其中显示皮肤Id:

/**
 *
 * @ORM\OneToOne(targetEntity="MediaparkLt\SkinBundle\Entity\Skin", mappedBy="email_id")
 * @ORM\JoinColumn(name="skin", referencedColumnName="id")
 */
protected $skin;

现在在我的CMS中,我创建了这样的新电子邮件:

public function saveAction(Request $request) {
    $item = new Email();
    $type = new EmailType($this->container->getParameter("langs"));
    $form = $this->createForm($type, $item);
    $form->handleRequest($request);
    $em = $this->getEntityManager();

    if ($form->isValid()) {    
            $this->upload($form, $item);

            $em->persist($item);
            $em->flush();
            return $this->redirect($this->generateUrl('cms_skin_email_list', array('skin_id' => $item->getId())));
    }

    return array('form' => $form->createView(), 'item' => $item);
}

这就是形式:

public function buildForm(FormBuilderInterface $builder, array $option) {
    $builder->add('title', 'text', array('label' => 'cms.Title'));
    $builder->add('registration_content', 'textarea', array('label' => 'cms.registration.content'));
}

现在在mysql中我创建了这样的关系:

ALTER TABLE `skin` ADD CONSTRAINT `emailId` FOREIGN KEY (`email_id`) REFERENCES `lottery`.`email`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;

现在,当我创建新电子邮件时,我仍然会在这两个权限上获得NULL。

1 个答案:

答案 0 :(得分:1)

当您创建具有一对一关系的两个实体时,两个实体都需要显式保留,或者在关系的一侧使用级联保持。您还需要明确设置关系的两个方面。

Doctrine - Working with Associations - Transitive persistence / Cascade Operations

国:

  

即使您持有包含我们新评论此代码的新用户   如果你删除了呼叫将会失败   EntityManager的坚持#($ myFirstComment)。学说2不会级联   对所有新嵌套实体的持久化操作。

Doctrine - Working with Associations - Establishing Associations

国:

  

在双向关联的情况下,您必须更新   双方的领域

如果没有级联,你需要这样的东西:

$skin = new Skin();
$email = new Email();
$skin->setEmail($email);
$email->setSkin($skin);
$em->persist($email);
$em->persist($skin);
$em->flush();

如果在关系的皮肤一侧保持级联,则可以省略$em->persist($skin)。请注意,如果级联持续存在,通常也会级联删除:

 * @ORM\OneToOne(targetEntity="MediaparkLt\UserBundle\Entity\Email", inversedBy="skin", cascade={"persist", "remove"})