我有两个实体Skin
和Email
。我希望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。
答案 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"})