我在扩展symfony2中具有相同数据库表名称的实体时遇到问题。我试图在symfony中扩展一个实体,但基本实体需要是可重用的,所以它不会总是被扩展。
这是我目前拥有的一个简化的例子。我的客户实体:
namespace BundleEntityCustomer;
/**
* @ORMTable(name="customer")
* @ORMEntity()
*/
class Customer implements CustomerInterface, UserInterface
{
//implementing variables and getters/setters
}
扩展实体(在另一个捆绑包中):
namespace AnotherBundleEntityCustomer;
use BundleEntityCustomerCustomer as BaseCustomer;
/**
* @ORMEntity()
*/
class Customer extends BaseCustomer
{
//implementing variables and getters/setters
}
客户界面:
namespace BundleModelCustomer;
interface CustomerInterface
{
// public methods of the first Customer class
}
在我的config.yml中,我有以下规则:
resolve_target_entities:
BundleModelCustomerCustomerInterface: AnotherBundleEntityCustomerCustomer
当生成SQL时,我得到以下错误:
[DoctrineDBALSchemaSchemaException]
The table with name 'customer' already exists.
我需要第二个实体来扩展第一个(基本)实体并维护数据库表名。但当我不扩展第一个(基本)实体时,我仍然希望这个实体自己工作。
我尝试过这个来源,但他们无法解决我的问题:在Symfony2中创建具有可扩展实体的可移植Bundles(不起作用,尽管实体确实映射到了正确的实体,但它仍然给了我重复的表名错误)
此外,学说的固有映射似乎也于事无补(http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html)
我理解这个错误,但难道不能让两个实体(相互扩展)写入同一个数据库表吗
您的示例中没有配置继承。您必须设置单表继承才能执行您想要的操作:
/**
* @Entity(name="customer")
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"customer1" = "NamespaceToFirstBundleCustomer", "customer2" = "NamespaceToAnotherBundleCustomer"})
*/
class Customer implements CustomerInterface, UserInterface
{ ... }
然后,让你的第二个客户类扩展第一个,这应该会起作用。
对我来说,最好的方法是忽略dbal级别的第二个实体。将创建表,并且不会出现错误。https://groups.google.com/forum/?fromgroups=#!主题/条令用户/rwWXZ7faPsA
附言:谢谢Marco Pivetta,Alexandru Trandafir Catalin。