我在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个实体(相互扩展)写入同一个数据库表
答案 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。