1

我正在使用 zf2 并且我有实体 DepositDict 可以有很多 periodTimeAmounts。每个 periodTimeAmount 可以有许多 periodMoney 元素。我可以使用许多 periodTimeAmounts 将我的实体保存到数据库中,但 periodMoney 仅保存最后一个 periodTimeAmount 实体。

存款字典

<?php
/*...*/

class DepositDict
{
/*...*/

/**
 *
 * @ORM\OneToMany(targetEntity="DepositDict\Entity\DepositDictPeriodTimeAmount", mappedBy="depositDict", cascade={"persist", "remove"})
 * @var \Doctrine\Common\Collections\ArrayCollection
 */
protected $periodTimeAmounts;


public function __construct() {
    $this->periodTimeAmounts = new ArrayCollection();
}

/*...*/

public function getPeriodTimeAmounts()
{
    return $this->periodTimeAmounts;
}

public function addPeriodTimeAmounts(Collection $periodTimeAmounts)
{
    if ( $this->getPeriodType() == self::PERIOD_TYPE_TIME_AMOUNT ) {

        foreach ( $periodTimeAmounts as $periodTimeAmount )
        {
            $periodTimeAmount->setDepositDict($this);
            $this->periodTimeAmounts->add($periodTimeAmount);
        }
    }
}

public function removePeriodTimeAmounts(Collection $periodTimeAmounts)
{
    foreach ( $periodTimeAmounts as $periodTimeAmount )
    {
        $periodTimeAmount->setDepositDict(null);
        $this->periodTimeAmounts->removeElement($periodTimeAmount);
    }
}

}
?>

DepositDictPeriodTimeAmount

<?php
/*...*/

class DepositDictPeriodTimeAmount
{

/*...*/

/**
 * @ORM\ManyToOne(targetEntity="DepositDict\Entity\DepositDict", inversedBy="periodTimeAmounts")
 * @ORM\JoinColumn(name="deposit_dict_id", referencedColumnName="id")
 */
protected $depositDict;

/**
 * @ORM\OneToMany(targetEntity="DepositDict\Entity\DepositDictPeriodMoney", mappedBy="periodTimeAmount", cascade={"persist", "remove"})
 */
protected $periodMoney;


public function __construct() {
    $this->periodMoney = new ArrayCollection();
}

public function getDepositDict()
{
    return $this->depositDict;
}

public function setDepositDict(DepositDict $depositDict=null)
{
    if ( $depositDict === null || $depositDict instanceof DepositDict ) {
        $this->depositDict = $depositDict;
    }
    else {
        throw new \InvalidArgumentException('$depositDict must be instance of Entity\DepositDict');
    }
}

public function getPeriodMoney()
{
    return $this->periodMoney;
}

public function addPeriodMoney(Collection $moneyPeriods) //changed name because money is uncountable
{
    foreach ( $moneyPeriods as $moneyPeriod )
    {
        $moneyPeriod->setPeriodTimeAmount($this);
        $this->periodMoney->add($moneyPeriod);
    }
}

public function removePeriodMoney(Collection $moneyPeriods)
{
    foreach ( $moneyPeriods as $moneyPeriod )
    {
        $moneyPeriod->setPeriodTimeAmount(null);
        $this->periodMoney->removeElement($moneyPeriod);
    }
}

/*...*/

}
?>

存款字典期间钱

<?php
/*...*/

class DepositDictPeriodMoney
{
/*...*/


/**
 * @ORM\ManyToOne(targetEntity="DepositDict\Entity\DepositDictPeriodTimeAmount", inversedBy="periodMoney")
 * @ORM\JoinColumn(name="deposit_dict_period_time_amount_id", referencedColumnName="id")
 */
protected $periodTimeAmount;

/*...*/

public function getPeriodTimeAmount()
{
    return $this->periodTimeAmount;
}

public function setPeriodTimeAmount(DepositDictPeriodTimeAmount $periodTimeAmount=null)
{
    if ( $periodTimeAmount === null || $periodTimeAmount instanceof DepositDictPeriodTimeAmount ) {
        $this->periodTimeAmount = $periodTimeAmount;
    }
    else {
        throw new \InvalidArgumentException('$periodTimeAmount must be instance of Entity\DepositDictPeriodTimeAmount');
    }
}

}
?>

少了什么东西?

4

1 回答 1

1

重要的

Doctrine 只会检查关联的拥有方是否有更改。

仅对关联的反面所做的更改将被忽略。确保更新双向关联的双方(或至少从 Doctrine 的角度来看拥有方)

  • OneToMany 关联永远不是拥有方。
  • 反面必须使用 OneToOne、OneToMany 或 ManyToMany 映射声明的 mappedBy 属性。mappedBy 属性包含拥有方的关联字段的名称
  • 拥有方必须使用 OneToOne、ManyToOne 或 ManyToMany 映射声明的 inversedBy 属性。inversedBy 属性包含反面关联字段的名称。
  • ManyToOne 始终是双向关联的拥有方。
  • OneToMany 始终是双向关联的反面。

收集中的新实体不会自动由学说管理。

首先,请确保在刷新之前调用persist。

$em->persist($entity); 
$em->flush();

您已经设置了级联持久性和删除选项 - 这很好。

您要尝试的下一件事是将合并选项添加到您的级联中。如果您的相关实体因某些原因而分离,那么它们将被合并,例如:

/**
 * @ORM\OneToMany(targetEntity="DepositDict\Entity\DepositDictPeriodMoney", mappedBy="periodTimeAmount",   cascade={"persist", "remove", "merge"})
 */

merge :级联合并操作到关联实体。

于 2013-05-23T05:27:03.483 回答