Doctrine2 Symfony2在不同的bundle中扩展实体,但具有相同的数据库表名

时间:2014-01-14 17:45:05

标签: symfony doctrine-orm

我在symfony2中使用相同的数据库表名扩展实体时遇到问题。 我正在尝试在symfony中扩展一个实体,但基本实体需要可重用,因此不会总是扩展。

这是我目前拥有的简化示例。 我的客户实体:

namespace Bundle\Entity\Customer;

/**
 * @ORM\Table(name="customer")
 * @ORM\Entity()
 */
class Customer implements CustomerInterface, UserInterface
{
    //implementing variables and getters/setters
}

扩展实体(在另一个包中):

namespace AnotherBundle\Entity\Customer;

use Bundle\Entity\Customer\Customer as BaseCustomer;

/**
 * @ORM\Entity()
 */
class Customer extends BaseCustomer
{
    //implementing variables and getters/setters
}

CustomerInterface:

namespace Bundle\Model\Customer;

interface CustomerInterface
{
    // public methods of the first Customer class
}

在我的config.yml中,我有以下规则:

resolve_target_entities:
        Bundle\Model\Customer\CustomerInterface: AnotherBundle\Entity\Customer\Customer

生成SQL时出现以下错误:

[Doctrine\DBAL\Schema\SchemaException]
The table with name 'customer' already exists.

我需要第二个实体来扩展第一个(基础)实体并维护数据库表名。但是当我不扩展第一个(基础)实体时,我仍然希望这个实体可以自己工作。

我尝试了这个来源,但他们无法解决我的问题: Creating portable Bundles with extendable entities in Symfony2(没有用,虽然实体确实映射到了正确的实体,它仍然给了我重复的表名错误)

此外,学说的遗传映射似乎没有帮助(http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html

我理解错误,但是不应该能够将2个实体(相互扩展)写入同一个数据库表

2 个答案:

答案 0 :(得分:2)

您的示例中未配置继承。您必须设置single table inheritance以执行您想要的操作:

/**
 * @Entity(name="customer")
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"customer1" = "Namespace\To\First\Bundle\Customer", "customer2" = "Namespace\To\Another\Bundle\Customer"})
 */
class Customer implements CustomerInterface, UserInterface
{ ... }

然后,让第二个客户类扩展第一个,这应该有效。

答案 1 :(得分:1)

对我而言,最好的方法是忽略dbal级别的第二个实体。表格将被创建, 并且不会出现错误。 https://groups.google.com/forum/?fromgroups=#!topic/doctrine-user/rwWXZ7faPsA

P.S。感谢Marco Pivetta,Alexandru Trandafir Catalin。