Doctrine2实体默认值为ManyToOne关系属性

时间:2014-10-02 15:02:39

标签: doctrine-orm

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

/**
 * @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";

}

我需要在创建订单对象的新实例时将此status属性设置为默认值。

对于“非关系”属性,我可以简单地将其设置为上面的$ stringProperty。但如何为关系做到这一点?

  • 我无法将值设置为相关记录的ID,因为Doctrine2会抱怨。
  • 如果配置的默认值是状态实体的“参考”,则可以。可用状态'是固定的,不会(经常)改变。

如何配置实体以配置正确的默认关系。

最好不要在听众中坚持,因为在此之前可能会要求状态。

1 个答案:

答案 0 :(得分:3)

有几种方法,但我建议使用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将在订单对象中执行此类操作,然后在持久或更新之前使用侦听器“修复”。

class Order
{
    public function __construct()
    {
        $this->status = new Status('Default');
    }
}

问题当然是数据库中已经存在默认状态对象,因此当您刷新时会出现错误。因此,您需要在实体管理器上挂起onFlush(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#onflush)侦听器,检查状态对象是否由实体管理器管理,如果没有,则将其替换为通过实体管理器获取的托管对象

这种方法可以让您处理更多“纯粹”的域模型,而不必担心持久层。另一方面,处理冲洗可能很棘手。在握紧的手上,一旦你开始工作,它确实开辟了一些主要的可能性。

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

还有一个问题,即状态实体究竟是做什么的。如果它包含的是某种状态状态('输入',已处理')等等。那么你可能会认为它只是一个字符串。有点像ROLE_USER对象。