如何使用yaml在doctrine2中建模继承?

时间:2011-06-07 12:24:46

标签: inheritance yaml doctrine-orm

如何以yaml方式声明doctrine2继承?

我在学说文档中找不到任何关于此的代码片段,示例或食谱文章。

当我以doctrine1的方式尝试它时,我得到一个错误,即实体没有主键。

谢谢!

3 个答案:

答案 0 :(得分:3)

尝试使用文档中的examples(采用@Annotations格式)进行简单的模型继承,并使用带参数 orm的doctrine命令行工具将它们转换为yaml:convert-mapping < / em>(用于转换支持的格式之间的映射信息)。更多信息here

答案 1 :(得分:2)

Doctrine2中有几种不同类型的inheritance。以下是两种最常见类型的示例:

Mapped Superclass

# 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子类扩展父类。

您可以向类中添加所需的任何字段和关系,但您应该在文档中注意关于您可以添加到父级的关系的警告:

  

映射的超类不能是实体,它不具有查询能力   由映射的超类定义的持久关系必须是   单向的(仅限拥有方)。这意味着一对多   根本不可能在映射的超类上进行关联。   此外,只有映射后,才能实现多对多关联   超类目前仅用于一个实体。对于   进一步支持继承,单个或连接表继承   必须使用功能。

Single-Table Inheritance

方便的是,文档已经给出了单表继承的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