Doctrine orm 多通关系属性的Doctrine2实体默认值

Doctrine orm 多通关系属性的Doctrine2实体默认值,doctrine-orm,Doctrine Orm,我有一个名为“Order”的Doctrine2实体,它有几个状态属性。“允许的状态”存储在不同的实体中,因此为这些实体定义了多通关系 /** * @ORM\Entity() */ class Order extends AbstractEntity { // ... /** * @ORM\ManyToOne(targetEntity="Status") * @ORM\JoinColumn(onDelete="NO ACTION", nullable=fal

我有一个名为“Order”的Doctrine2实体,它有几个状态属性。“允许的状态”存储在不同的实体中,因此为这些实体定义了多通关系

/**
 * @ORM\Entity()
 */
class Order extends AbstractEntity {
    // ...
    /**
     * @ORM\ManyToOne(targetEntity="Status")
     * @ORM\JoinColumn(onDelete="NO ACTION", nullable=false)
     */
    protected $status;

    /** @ORM\Column(nullable=true) */
    protected $stringProperty = "default value";

}
创建order对象的新实例时,需要将此status属性设置为默认值

对于“非关系”属性,我可以简单地将其设置为上面的$stringProperty。但是,如何处理关系呢

  • 我无法将该值设置为相关记录的id,因为Doctrine2会抱怨
  • 如果配置的默认值是对状态实体的“引用”,则可以。“可用状态”是固定的,不会改变(经常)
如何配置实体以配置正确的默认关系


持久化时最好不要在侦听器中,因为在此之前可能会请求状态。

有几种方法,但我建议将OrderRepository用作创建新订单的工厂

class OrderRepository
{
    public function create()
    {
        $order = new Order();
        $status = $this->_em->find('Status','default'); // or getReference
        $order->setStatus($status);
        return $order;
    }
}

// In a controller
$orderRepository = $this->container->get('order_repository');
$order = $orderRepository->create();
通过使用存储库,您可以初始化准备好持久化的复杂实体图

==========================================================================

计划B是在order对象中执行此类操作,然后在持久化或更新之前使用侦听器“修复”

class Order
{
    public function __construct()
    {
        $this->status = new Status('Default');
    }
}
当然,问题是数据库中已经存在一个默认状态对象,因此当刷新时会出现错误。因此,您需要在实体管理器上挂起onFlush()侦听器,检查状态对象是否由实体管理器管理,如果不是,则将其替换为通过实体管理器获取的托管对象

这种方法可以让您处理更“纯”的域模型,而不用担心持久层。另一方面,处理同花顺可能很棘手。在紧握的手上,一旦你让它工作起来,那么它确实打开了一些主要的可能性

========================================================


还有一个问题是身份实体究竟做什么。如果它包含的是某种状态状态(“输入”、“已处理”)等等,那么您可以考虑只将它作为字符串。有点像角色用户对象。

简单但非常有效的解决方案。我怎么没想到呢。我曾想过创建一个单独的服务,但那感觉很奇怪,也太过分了。这保持了创建新实体和查找现有实体的逻辑。对于订单内部状态需要更改(到另一个实体)的情况,您是否有建议?