4

我正在尝试在 Symfony 2 项目中使用 Doctrine 嵌入式。

我有一堂课Purchase,我有一个price可嵌入的字段:

/**
 * Products
 *
 * @ORM\Table(name="purchases")
 * @ORM\Entity
 */
class Purchase
{
    /**
     *
     * @ORM\Embedded(class="AppBundle\Entity\Embeddable\PriceEmbeddable")
     */
    private $price;

    /**
     * Set price
     *
     * @param MoneyInterface $price
     * @return $this
     */
    public function setPrice(MoneyInterface $price)
    {
        $this->price = $price;

        return $this;
    }

    /**
     * Get price
     *
     * @return MoneyInterface|float
     */
    public function getPrice()
    {
        return $this->price;
    }

}

由于价格需要一种货币才能完整,所以我有一个可嵌入的类来存储这两个值:

/**
 * @ORM\Embeddable
 */
class PriceEmbeddable
{
    /** @ORM\Column(type = "integer") */
    private $amount;

    /** @ORM\Column(type = "string") */
    private $currency;
}

现在,数据库中的模式已正确创建,但是,当我持久化Purchase实体时,出现以下错误:

SQLSTATE [23000]:违反完整性约束:1048 列 'price_amount' 不能为空

我相信它:我还不明白这个机制是如何工作的。

我如何从“真实”实体(Purchase)中设置和获取值?

我将值作为Money对象(我使用的值对象)传递给实体中的方法setPrice()Purchase但是,如何将此值拆分为两个属性amountcurrency在可嵌入类中设置?

因为做一个var_dump(使用VarDumperdump()的功能)我得到了正确的实体集:

PurchaseListener.php on line 58:
Purchase {#1795 ▼
  ...
  -price: Money {#1000 ▼
    -amount: 86
    -currency: Currency {#925 ▼
      -currencyCode: "EUR"
    }
  }
}

但是这些值没有在 Embeddable 中设置,我不明白为什么......

我也尝试对嵌入式类中的值进行硬编码,但无论如何它都不起作用,而且我也不明白为什么:

/**
 * @ORM\Embeddable
 */
class PriceEmbeddable
{
    /** @ORM\Column(type = "integer") */
    private $amount;

    /** @ORM\Column(type = "string") */
    private $currency;

    public function __construct($value)
    {
        $this->currency = 'EUR';
        $this->amount = 90;
    }

    public function setAmount($amount)
    {
        $this->amount = $amount = 90;
    }

    public function setCurrency($currency)
    {
        $this->currency = $currency = 'EUR';
    }

    public function getAmount()
    {
        return $this->amount;
    }

    public function getCurrency()
    {
        return $this->currency;
    }
}
4

2 回答 2

1

这是简单的解决方案:

/**
 * Products
 *
 * @ORM\Table(name="purchases")
 * @ORM\Entity
 */
class Purchase
{
    /**
     *
     * @ORM\Embedded(class="AppBundle\Entity\Embeddable\PriceEmbeddable")
     */
    private $price;

    /**
     * Set price
     *
     * @param PriceEmbeddable $price
     * @return $this
     */
    public function setPrice(PriceEmbeddable $price)
    {
        $this->price = $price;

        return $this;
    }

    /**
     * Get price
     *
     * @return PriceEmbeddable
     */
    public function getPrice()
    {
        return $this->price;
    }

}
于 2015-08-29T19:16:16.323 回答
0

您必须PriceEmbeddablePurchase构造函数中显式实例化:

class Purchase
{
  ...

  function __construct() {
      $this->price = new PriceEmbeddable();
  }

  ...

}
于 2021-02-02T21:22:44.097 回答