Orm 如何使用XML或YAML而不是注释映射定义Doctrine mappedSuperclass

Orm 如何使用XML或YAML而不是注释映射定义Doctrine mappedSuperclass,orm,doctrine-orm,doctrine,superclass,supertype,Orm,Doctrine Orm,Doctrine,Superclass,Supertype,下面的脚本来自,仅更改为包含第二个子类。我的理解是,MappedSuperclassBase不能单独存在,但必须由一个子类扩展(即EntitySubClassOne或EntitySubClassTwo),这与SQL的超类型/子类型的概念相同。同意吗 如何使用YAML或XML而不是注释映射来定义超级/子类型 <?php /** @MappedSuperclass */ class MappedSuperclassBase { /** @Column(type="integer") *

下面的脚本来自,仅更改为包含第二个子类。我的理解是,
MappedSuperclassBase
不能单独存在,但必须由一个子类扩展(即
EntitySubClassOne
EntitySubClassTwo
),这与SQL的超类型/子类型的概念相同。同意吗

如何使用YAML或XML而不是注释映射来定义超级/子类型

<?php
/** @MappedSuperclass */
class MappedSuperclassBase
{
    /** @Column(type="integer") */
    protected $mapped1;
    /** @Column(type="string") */
    protected $mapped2;
    /**
     * @OneToOne(targetEntity="MappedSuperclassRelated1")
     * @JoinColumn(name="related1_id", referencedColumnName="id")
     */
    protected $mappedRelated1;

    // ... more fields and methods
}

/** @Entity */
class EntitySubClassOne extends MappedSuperclassBase
{
    /** @Id @Column(type="integer") */
    private $id;
    /** @Column(type="string") */
    private $name;

    // ... more fields and methods
}

/** @Entity */
class EntitySubClassTwo extends MappedSuperclassBase
{
    /** @Id @Column(type="integer") */
    private $id;
    /** @Column(type="string") */
    private $name;

    // ... more fields and methods
}

根据我们的评论,我想我看到了你的困惑。因为在同一页上同时处理“MappedSuperclass”和“Discriminator”,我想你已经混淆了它们的用途。希望这能帮助您:

  • MappedSuperclass
    以可重用的方式提供属性/默认值,但它本身永远不能是一个实体。这与PHP的
    抽象类
    相当(不能单独实例化)
  • 鉴别器提供了“扩展”实体的能力,使其成为另一个实体。例如,拥有一个
    实体将为您提供一个实体。该实体可以扩展,例如通过
    工作者
    管理者
MappedSuperclass
的一个好用例是
AbstractEntity
。每个实体都需要一个ID,一个唯一的标识符。它还为您提供了一些在侦听器中检查的常见内容。因此,请继续创建:

/**
 * @ORM\MappedSuperclass
 */
abstract class AbstractEntity
{
    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", options={"unsigned":true})
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
  
    // getter / setter
}
查看这是如何声明的
abstract
MappedSuperclass

这是因为(
abstract class
MappedSuperclass
)都不能单独实例化。您不能执行
$entity=new AbstractEntity()
,因为它是一个
abstract
PHP类。条令也不会为
AbstractEntity
创建单独的表

接下来,创建一个
人员

/**
 * @ORM\Entity
 * @ORM\Table(name="persons")
 *
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 */
class Person extends AbstractEntity
{
    /**
     * @var string
     * @ORM\Column(name="name", type="string", length=255, nullable=false)
     */
    protected $name;

    // getter / setter
}
上面的
Person
,实体是通过
JOINED
继承类型设置的。这意味着,在数据库级别,表
Person
将与其他实体添加的任何列分开,扩展
Person

请注意,我没有声明
DiscriminatorMap
。以下是我用粗体突出显示的文档:

注意事项:

  • 必须在作为映射实体层次结构一部分的最顶层类上指定@InheritanceType、@DiscriminatorColumn和@DiscriminatorMap
  • @DiscriminatorMap指定鉴别器列的哪些值将行标识为哪种类型。在上述情况下,值“person”将行标识为person类型,“employee”将行标识为employee类型
  • 如果类包含在与应用鉴别器映射的实体类相同的命名空间中,则鉴别器映射中的类的名称不需要完全限定
  • 如果未提供鉴别器映射,则自动生成映射。自动生成的鉴别器映射包含每个类的小写短名称作为键
现在,让我们创建一个
工作者

/**
 * @ORM\Entity
 * @ORM\Table(name="workers")
 */
class Worker extends Person
{
    /**
     * @var int
     * @ORM\Column(name="worker_id", type="integer", length=11, nullable=false)
     */
    protected $workerId;

    // getter / setter
}
所以,现在我们有:

  • MappedSuperclass:
    抽象实体
    -不是独立实体
  • 区分:
    个人
    -是一个独立的实体
  • “正常”:
    工人
    -扩展
注意事项:

  • 无法实例化MappedSuperclass。因此:您无法创建指向它的链接/关系。与PHP的
    抽象类
  • 鉴别实体是一个独立的实体,可以用作普通实体。您可以创建与it之间的关系,而不会产生任何问题
  • 扩展鉴别实体的实体是两者的实例。在上面的代码中,这两个都是正确的:
    $worker instanceof worker
    $worker instanceof Person
    ,因为
    worker
    扩展了
    Person
    。但是,
    $person instanceof Worker
    将为
    false
$workerId=$person->getWorkerId()//生成“方法不存在”致命的

$workerId=$worker->getWorkerId()//生成整数值



希望能帮你把事情弄清楚。如果没有,请随时询问。

在您的链接上,向下滚动至此处:;-)@rkeet除非我弄错了,否则该部分只描述关联覆盖,而所讨论的部分被省略,并被描述为
//其他字段映射
。您的问题是“如何使用Yaml/XML进行转换”。如果您特别转到该链接,代码示例顶部有选项卡,允许您切换语言。如果您阅读该代码,您将看到如何映射请求的
MappedSuperClass
。(Yaml:
type:mappedSuperclass
,XML:
)@rkeet但它没有显示与OneToOne(targetEntity=“MappedSuperclassRelated1”)
和JoinColumn(name=“related1\u id”,referencedColumnName=“id”)
等价的内容,当然,这并不难转换。更重要的是,它没有解释
EntitySubClass
如何知道它与
MappedSuperclassBase
关联,而这正是我正在努力解决的问题。感谢如果
Worker
扩展
Person
(超类),那么您就有一个实体:Worker。创建与
员工的关系(即从
工资支票
),只链接到员工。超类
Person
只创建了一组基本的属性/默认值,这些属性/默认值在Worker中使用。谢谢rkeet。在您的示例中,您明确定义了
类Person extends AbstractEntity
。但是,如果使用XML或YAML实现,人们不应该