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->$