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;
    }

}

価格には完全な通貨が必要なので、これら 2 つの値を格納する組み込み可能なクラスを用意しました。

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

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

これで、データベースのスキーマは正しく作成されましたが、Purchaseエンティティを永続化すると、次のエラーが発生します。

SQLSTATE[23000]: 整合性制約違反: 1048 列 'price_amount' を null にすることはできません

そして、私はそれを信じています: 私はまだメカニズムがどのように機能するかを理解していません.

「実際の」エンティティ ( Purchase) から値を設定および取得するにはどうすればよいですか?

Money値をオブジェクト (私が使用する値オブジェクト) としてエンティティのメソッドsetPrice()に渡しますPurchaseが、この値はどのように 2 つのプロパティに分割amountcurrencyれ、埋め込み可能なクラスに設定されるのでしょうか?

var_dump( VarDumper の関数dump()を使用して) を実行すると、エンティティが正しい方法で設定されます。

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 に答える