我有两个不同的包:
我需要在客户和订单之间创建一个oneToMany关系(显然一个客户执行许多订单)但我需要保持第一个包 OrderBundle 与第二个包分离,因为OrderBundle旨在重用其他的东西。
我认为正确的方法可能是这样的http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html,但我无法弄清楚如何具体实施。
如果我不能在ManyToOne学说映射中专门使用像targetEntity这样的客户,那么如何实现Order和Customer之间的关系?
非常感谢,提前。
更新
我写下了所涉及的代码,以便更好地解释。
\\ Order\Bundle\Entity\Order.php
class Order {
/**
* @ORM\ManyToOne(targetEntity="Order\Bundle\Model\OrderSubjectInterface", inversedBy="orders")
* @var SourceSubjectInterface
*/
protected $subject; // How to define getter ans setter for $subject ? Do I
have to use php app/console doctrine:generate:entities command?
...
\\ Customer\Bundle\Entity\Customer.php
use Order\Bundle\Model\OrderSubjectInterface;
class Customer implements OrderSubjectInterface{
/**
* @ORM\OneToMany(targetEntity="Order\Bundle\Entity\Order", mappedBy="subject")
*/
private $orders;
如何定义getter,setter和界面?
答案 0 :(得分:2)
是的,这是正确的方法。
如您所提及的文档中所示,您可以在ManyToOne映射中将OrderSubjectInterface
指定为targetEntity。
这样,您就知道您的订单与主题相关。在您的情况下,这些主题是app/config/config.yml
中定义的客户。
答案 1 :(得分:2)
如果你到处都有实体定义,那么很难完全解耦束。问题是,默认情况下,Doctrine不允许丢失相关实体。让我们从头开始。
如果您只想解耦Order实体,您需要做的是为其所有相关实体创建接口(他们需要实现它们),然后使用ResolveTargetEntity。因此,不是引用完整的实体,而是引用接口(当您在实体中定义关系时)。最后,您可以设置哪个接口映射到配置中的哪个实体。
这样做可以让您获取Order捆绑并将其放在具有完全不同实体结构的环境中。重要的是,在新环境中不得缺少与Order相关的实体(它们可能完全不同,但它们必须实现与原始相同的接口)。然后更改设置,以便接口指向新环境中的实体。
如您所见,这不是“完全解耦”的代码。没有一些细节,我无法帮助你。关系是双向的还是单向的?你对“重用其他东西”的确切含义是什么,你能更详细一点吗?