Php 条令存储非实体的对象值
我怎样才能解决这个问题。实体类聚合对象。其值应存储在数据库中。我拥有以下实体:Php 条令存储非实体的对象值,php,symfony,orm,doctrine-orm,doctrine,Php,Symfony,Orm,Doctrine Orm,Doctrine,我怎样才能解决这个问题。实体类聚合对象。其值应存储在数据库中。我拥有以下实体: <?php class Price { private $_amount; public function getAmount() { return $this->_amount; } public function setAmount($amount) { $this->_amount = $amount;
<?php
class Price
{
private $_amount;
public function getAmount()
{
return $this->_amount;
}
public function setAmount($amount)
{
$this->_amount = $amount;
return $this;
}
}
/**
* Class Product
*
* @Entity
* @Table(name="product", options={"engine" = "NDBCLUSTER"})
*/
class Product
{
/**
* @Id
* @GeneratedValue
* @Column(name="id", type="integer")
* @var int
*/
private $_id;
/**
* @Column(name="price", type="decimal", precision=10, scale=2)
* @var Price
*/
private $_price;
}
?>
如果我想在数据库中存储价格,我该怎么做?这显然不起作用:
<?php
$price = new Price();
$price->setAmount(19.99);
$product = new Product();
$product->setPrice($price);
$em->persist($product);
$em->flush();
?>
我必须实现新的映射类型吗?您可以定义您可以定义您可以使用条令
将您的价格声明为可嵌入价格,如下所示:
/**
* @Embeddable
*/
class Price
{
/** @Column(type = "decimal") */
private $_amount;
...
然后使用它:
class Product
{
/** @ORM\Embedded(class="Price") */
private $price;
...
你可以使用教义
将您的价格声明为可嵌入价格,如下所示:
/**
* @Embeddable
*/
class Price
{
/** @Column(type = "decimal") */
private $_amount;
...
然后使用它:
class Product
{
/** @ORM\Embedded(class="Price") */
private $price;
...
您应该在条令中创建自定义类型,如:
declare(strict_types = 1);
namespace App\Infrastructure\Persistence\Doctrine\Type;
use App\Domain\Model\OrderStatus;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\ConversionException;
use Doctrine\DBAL\Types\TextType;
final class StatusDoctrineType extends TextType
{
/**
* @return string
*/
public function getName()
{
return 'status_doctrine_type';
}
/**
* @param $value
* @param AbstractPlatform $platform
*
* @return OrderStatus
* @throws ConversionException
*/
public function convertToPhpValue($value, AbstractPlatform $platform): OrderStatus
{
if (null === $value) {
throw ConversionException::conversionFailed($value, $this->getName());
}
return new OrderStatus($value);
}
/**
* @param mixed $value
* @param AbstractPlatform $platform
*
* @return null|string
* @throws ConversionException
*/
public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string
{
if (null === $value) {
throw ConversionException::conversionFailed($value, $this->getName());
}
/** @var OrderStatus $value */
if (!is_a($value, OrderStatus::class)) {
throw ConversionException::conversionFailed($value, $this->getName());
}
return $value->currentStatus();
}
}
在你的实体中,类似这样的东西:
// ...
/**
* Order constructor.
*
* @param Route $route
* @param OrderId $orderId
* @param Distance $distance
*/
public function __construct(Route $route, OrderId $orderId, Distance $distance)
{
$this->route = $route;
$this->id = $orderId;
$this->distance = $distance->spacing();
// according to grasp Information Expert pattern.
$this->status = new OrderStatus(OrderStatus::UNASSIGN);
}
//...
/**
* @return OrderStatus
*/
public function status(): OrderStatus
{
return $this->status;
}
您应该在条令中创建自定义类型,如:
declare(strict_types = 1);
namespace App\Infrastructure\Persistence\Doctrine\Type;
use App\Domain\Model\OrderStatus;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\ConversionException;
use Doctrine\DBAL\Types\TextType;
final class StatusDoctrineType extends TextType
{
/**
* @return string
*/
public function getName()
{
return 'status_doctrine_type';
}
/**
* @param $value
* @param AbstractPlatform $platform
*
* @return OrderStatus
* @throws ConversionException
*/
public function convertToPhpValue($value, AbstractPlatform $platform): OrderStatus
{
if (null === $value) {
throw ConversionException::conversionFailed($value, $this->getName());
}
return new OrderStatus($value);
}
/**
* @param mixed $value
* @param AbstractPlatform $platform
*
* @return null|string
* @throws ConversionException
*/
public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string
{
if (null === $value) {
throw ConversionException::conversionFailed($value, $this->getName());
}
/** @var OrderStatus $value */
if (!is_a($value, OrderStatus::class)) {
throw ConversionException::conversionFailed($value, $this->getName());
}
return $value->currentStatus();
}
}
在你的实体中,类似这样的东西:
// ...
/**
* Order constructor.
*
* @param Route $route
* @param OrderId $orderId
* @param Distance $distance
*/
public function __construct(Route $route, OrderId $orderId, Distance $distance)
{
$this->route = $route;
$this->id = $orderId;
$this->distance = $distance->spacing();
// according to grasp Information Expert pattern.
$this->status = new OrderStatus(OrderStatus::UNASSIGN);
}
//...
/**
* @return OrderStatus
*/
public function status(): OrderStatus
{
return $this->status;
}
您应该将价格作为一个实体,并在这两个实体之间定义一个(或不同的,如果您需要)连接,因为您将
价格
存储为十进制
,您还可以向价格
实体添加toString
方法,只返回$this->$
您应该将Price作为一个实体,并定义这两个实体之间的OneToOne(或不同的,如果您需要)连接,因为您将Price
存储为十进制
,您还可以向Price
实体添加toString
方法,只返回$this->$代码>