我有一个名为“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。但如何为关系做到这一点?
如何配置实体以配置正确的默认关系。
最好不要在听众中坚持,因为在此之前可能会要求状态。
答案 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对象。