如何以yaml方式声明doctrine2继承?
我在学说文档中找不到任何关于此的代码片段,示例或食谱文章。
当我以doctrine1的方式尝试它时,我得到一个错误,即实体没有主键。
谢谢!
答案 0 :(得分:3)
尝试使用文档中的examples(采用@Annotations格式)进行简单的模型继承,并使用带参数 orm的doctrine命令行工具将它们转换为yaml:convert-mapping < / em>(用于转换支持的格式之间的映射信息)。更多信息here。
答案 1 :(得分:2)
Doctrine2中有几种不同类型的inheritance。以下是两种最常见类型的示例:
# MyProject.Model.Person.dcm.yml
MyProject\Model\Person:
type: mappedSuperClass
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
length: 50
...
# MyProject.Model.EmployedPerson.dcm.yml
MyProject\Model\EmployedPerson:
type: entity
fields:
occupation:
type: string
length: 100
...
然后,在PHP类中:
# Person.php
<?php
namespace MyProject\Model;
class Person
{
private $id;
private $name;
// Add public getters and setters
}
# EmployedPerson.php
<?php
namespace MyProject\Model;
class EmployedPerson extends Person
{
private $occupation;
// Add public getters and setters
}
要完成这项工作,您需要做两件事:在父级上使用type: mappedSuperClass
而不是type: entity
,并确保您的PHP子类扩展父类。
您可以向类中添加所需的任何字段和关系,但您应该在文档中注意关于您可以添加到父级的关系的警告:
映射的超类不能是实体,它不具有查询能力 由映射的超类定义的持久关系必须是 单向的(仅限拥有方)。这意味着一对多 根本不可能在映射的超类上进行关联。 此外,只有映射后,才能实现多对多关联 超类目前仅用于一个实体。对于 进一步支持继承,单个或连接表继承 必须使用功能。
方便的是,文档已经给出了单表继承的YAML配置示例:
MyProject\Model\Person:
type: entity
inheritanceType: SINGLE_TABLE
discriminatorColumn:
name: discr
type: string
discriminatorMap:
person: Person
employee: Employee
MyProject\Model\Employee:
type: entity
答案 2 :(得分:-1)
管理关系数据库中的继承存在三种主要策略。
您可以找到如何使用Doctrine 2以YAML格式在Symfony网站上创建每个策略: YAML Inheritance with Doctrine