【问题标题】:Symfony2 & Doctrine : One-To-One relation and persistence of the id referencesSymfony2 & Doctrine : id 引用的一对一关系和持久性
【发布时间】:2013-10-11 14:46:16
【问题描述】:

我在两个实体之间建立双向一对一关系时遇到问题。 我有一个可以引用另一个实体“DonationData”的实体“Campaign”。创建的捐赠数据始终与活动相关联。我想要一个双向关系,因为我希望能够从 DonationData 实体中找到相关的活动。

这是我的广告系列实体代码:

<?php
/**
 * @ORM\Entity
 * ...
 */
class Campaign
{
...
/**
 * @ORM\OneToOne(targetEntity="DonationData", mappedBy="campaign", cascade={"persist", "remove"})
 */
protected $donationData;

...

/**
 * Set donationData
 *
 * @param DonationData $donationData
 * @return Campaign
 */
public function setDonationData(DonationData $donationData = null)
{
    $this->donationData = $donationData;

    return $this;
}

...

?>

以及我的 DonationData 实体的相关代码:

<?php
/**
 * @ORM\Entity
 * ...
 */
class DonationData
{
...
/**
 * @ORM\OneToOne(targetEntity="Campaign")
 * @ORM\JoinColumns({
 *     @ORM\JoinColumn(name="campaign_id", referencedColumnName="id")
 * })
 */
protected $campaign;

...

/**
 * Set campaign
 * @param Campaign $campaign
 *
 * @return DonationData
 */
public function setCampaign($campaign)
{
    $this->campaign = $campaign;

    return $this;
}


...
?>

我在我的活动表单 (CampaignType.php) 中添加我的 DonationData 表单的代码段

<?php
...
->add('donationData', new DonationDataType(), array(
    'label' => false
))
...
?>

在 CampaignController.php 方面,当我处理创建操作时,我没有更改任何内容:我只是保留从请求中绑定的相关实体,然后刷新实体管理器:

<?php
...
$em->persist($campaign);
$em->flush();
...
?>

我的问题是,当我想保留一个包含嵌入式 DonationData 表单的 Campaign 实体表单时。我成功地持久化了 Campaign 和 DonationData 实体,但在 Campaign 条目中只有 donation_data_id 引用被持久化。当我在数据库中查看持久的 DonationData 时,campaign_id 始终设置为 NULL。

您对此有什么解释吗?

谢谢。

【问题讨论】:

  • 注意:我发现持久化它的唯一方法是在持久化之前手动将 Campaign 设置为 DonationData。但是,在我看来,这并不是真正的“通用”并且是一种干净的方式。我想应该是手动的。我说的对吗?

标签: symfony doctrine-orm one-to-one


【解决方案1】:

在 DonationData 类中,字段 $campaign 你没有指定 inversedBy 属性,应该是

@ORM\JoinColumn(name="campaign_id", referencedColumnName="id", inversedBy="donationData")

您是否在父表单中设置了 cascade_validation 默认选项?

http://symfony.com/doc/current/reference/forms/types/form.html

【讨论】:

  • 我尝试将指定的 inversedBy 关系添加到我的字段和级联验证中,但它并没有改变任何东西。该活动使用donation_data_id 持久化,但在donation_data 条目中,campaign_id 仍为空。
  • 可能是因为在CampaignType表单中添加donationData表单的方式?我的意思是,我正在做“新的 DonationDataType()”。如果我不手动设置它可能无法链接到“父”实体?
  • 这就是学说中拥有方的用途,链接docs.doctrine-project.org/en/latest/reference/…应该为你做,我不明白的是campaign中的donation_data_id字段,你在数据库中看到了吗,它应该只存在于实体上,因为捐赠是定义了外键的捐赠
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多