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 つのプロパティに分割amount
さcurrency
れ、埋め込み可能なクラスに設定されるのでしょうか?
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;
}
}