Doctrine 2 class 继承映射
Doctrine 2 class heritance mapping
我正在尝试弄清楚如何正确映射我的实体,以便我可以制作 Doctrine 2 Class Table 继承 (Doc here)
所以我尝试了很多不同的解决方案,但我似乎无法使用命令行工具 (doctrine:schema:validate) 验证我的模型
这就是我的尝试。我没有更改 parent class 所以我会把它留在这里。
Api\TestBundle\Entity\Item:
type: entity
table: items
inheritanceType: JOINED
discriminatorColumn:
name: type
type: string
nullable: false
length: 32
fixed: false
comment: ''
discriminatorMap:
item_property_facebook: ItemPropertyFacebook
id:
id:
type: integer
nullable: false
unsigned: false
comment: ''
id: true
generator:
strategy: AUTO
fields:
bundledType:
type: string
nullable: false
length: 32
fixed: false
comment: ''
column: bundled_type
lifecycleCallbacks: { }
对于child class,我先放了另一个id:
Api\TestBundle\Entity\ItemPropertyFacebook:
type: entity
table: item_property_facebook
id:
id:
type: integer
nullable: false
unsigned: false
comment: ''
id: true
generator:
strategy: AUTO
fields:
account_id:
type: integer
lifecycleCallbacks: { }
显然,我得到:
Duplicate definition of column 'id' on entity 'Api\TestBundle\Entity
\ItemPropertyFacebook' in a field or discriminator column mapping.
所以我尝试删除 child 中的 id 定义,我得到:
No identifier/primary key specified for Entity "Api\TestBundle\Entit
y\ReferenceItemPropertyFacebook". Every Entity must have an identifier/prim
ary key.
所以我完全没有头绪。在文档中,他们只设置了基本的东西,但没有设置 id,我在网上找不到任何东西,因为我可能没有很好地表达它。我读到了 associationKey,但是当我尝试它时,Doctrine 告诉我相同的
No identifier/primary key specified for Entity "Api\TestBundle\Entit
y\ReferenceItemPropertyFacebook". Every Entity must have an identifier/prim
ary key.
因此,如果您有任何线索,我将不胜感激。非常感谢!
我不熟悉 yaml 生成,但是当我用 php 注释尝试你的结构时,它对我有用,重复的 id 列没问题:
/**
* @ORM\Entity
* @ORM\Table(name="items")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"item" = "Item", "item_property_facebook" = "ItemPropertyFacebook"})
*/
class Item {
/**
* @ORM\Column
* @ORM\Id
* @ORM\GeneratedValue()
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $bundledType;
}
/**
* @ORM\Entity
* @ORM\Table(name="item_property_facebook")
*/
class ItemPropertyFacebook extends Item {
/**
* @var
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue()
*/
protected $id;
/**
* @ORM\Column(type="integer")
*/
protected $account_id;
}
将生成那些 sql 命令:
CREATE TABLE items (id VARCHAR(255) NOT NULL, bundledType VARCHAR(255) NOT NULL, type VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE item_property_facebook (id VARCHAR(255) NOT NULL, account_id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE item_property_facebook ADD CONSTRAINT FK_B8C39352BF396750 FOREIGN KEY (id) REFERENCES items (id) ON DELETE CASCADE
唯一的区别是,我必须将 "item = "Item"
添加到 DiscriminatorMap。
另外,id定义中是否应该有id: true
行?对我来说似乎是多余的。
我正在尝试弄清楚如何正确映射我的实体,以便我可以制作 Doctrine 2 Class Table 继承 (Doc here)
所以我尝试了很多不同的解决方案,但我似乎无法使用命令行工具 (doctrine:schema:validate) 验证我的模型
这就是我的尝试。我没有更改 parent class 所以我会把它留在这里。
Api\TestBundle\Entity\Item:
type: entity
table: items
inheritanceType: JOINED
discriminatorColumn:
name: type
type: string
nullable: false
length: 32
fixed: false
comment: ''
discriminatorMap:
item_property_facebook: ItemPropertyFacebook
id:
id:
type: integer
nullable: false
unsigned: false
comment: ''
id: true
generator:
strategy: AUTO
fields:
bundledType:
type: string
nullable: false
length: 32
fixed: false
comment: ''
column: bundled_type
lifecycleCallbacks: { }
对于child class,我先放了另一个id:
Api\TestBundle\Entity\ItemPropertyFacebook:
type: entity
table: item_property_facebook
id:
id:
type: integer
nullable: false
unsigned: false
comment: ''
id: true
generator:
strategy: AUTO
fields:
account_id:
type: integer
lifecycleCallbacks: { }
显然,我得到:
Duplicate definition of column 'id' on entity 'Api\TestBundle\Entity
\ItemPropertyFacebook' in a field or discriminator column mapping.
所以我尝试删除 child 中的 id 定义,我得到:
No identifier/primary key specified for Entity "Api\TestBundle\Entit
y\ReferenceItemPropertyFacebook". Every Entity must have an identifier/prim
ary key.
所以我完全没有头绪。在文档中,他们只设置了基本的东西,但没有设置 id,我在网上找不到任何东西,因为我可能没有很好地表达它。我读到了 associationKey,但是当我尝试它时,Doctrine 告诉我相同的
No identifier/primary key specified for Entity "Api\TestBundle\Entit
y\ReferenceItemPropertyFacebook". Every Entity must have an identifier/prim
ary key.
因此,如果您有任何线索,我将不胜感激。非常感谢!
我不熟悉 yaml 生成,但是当我用 php 注释尝试你的结构时,它对我有用,重复的 id 列没问题:
/**
* @ORM\Entity
* @ORM\Table(name="items")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"item" = "Item", "item_property_facebook" = "ItemPropertyFacebook"})
*/
class Item {
/**
* @ORM\Column
* @ORM\Id
* @ORM\GeneratedValue()
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $bundledType;
}
/**
* @ORM\Entity
* @ORM\Table(name="item_property_facebook")
*/
class ItemPropertyFacebook extends Item {
/**
* @var
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue()
*/
protected $id;
/**
* @ORM\Column(type="integer")
*/
protected $account_id;
}
将生成那些 sql 命令:
CREATE TABLE items (id VARCHAR(255) NOT NULL, bundledType VARCHAR(255) NOT NULL, type VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE item_property_facebook (id VARCHAR(255) NOT NULL, account_id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE item_property_facebook ADD CONSTRAINT FK_B8C39352BF396750 FOREIGN KEY (id) REFERENCES items (id) ON DELETE CASCADE
唯一的区别是,我必须将 "item = "Item"
添加到 DiscriminatorMap。
另外,id定义中是否应该有id: true
行?对我来说似乎是多余的。