【问题标题】:Doctrine store object value that is not an entity学说存储不是实体的对象值
【发布时间】:2013-10-11 13:43:54
【问题描述】:

我该如何解决这个问题。一个实体类聚合一个对象。它的值应该存储在数据库中。我有以下实体:

<?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();

?>

我必须实现新的映射类型吗?

【问题讨论】:

  • 您应该将 Price 作为一个实体,并定义这两个实体之间的 OneToOne(或不同,如果需要)连接
  • 由于您将price 存储为decimal,您还可以将__toString 方法添加到您的Price 实体中,只需return $this-&gt;$_amount;

标签: php symfony orm doctrine-orm doctrine


【解决方案1】:

您可以使用学说Embeddables

将您的价格声明为像这样的嵌入式:

/**
 * @Embeddable 
 */
class Price
{
    /** @Column(type = "decimal") */
    private $_amount;

    ...

然后使用它:

class Product
{
    /** @ORM\Embedded(class="Price") */
    private $price;

    ...

【讨论】:

    【解决方案2】:

    你可以定义Custom Mapping Types

    【讨论】:

      【解决方案3】:

      您应该在教义中创建自定义类型,例如:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-08
        • 2021-10-06
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 2012-06-27
        相关资源
        最近更新 更多