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”,我想你已经混淆了它们的用途。希望这能帮助您:
以可重用的方式提供属性/默认值,但它本身永远不能是一个实体。这与PHP的MappedSuperclass
相当(不能单独实例化)抽象类
- 鉴别器提供了“扩展”实体的能力,使其成为另一个实体。例如,拥有一个
实体将为您提供一个实体。该实体可以扩展,例如通过人
和工作者
管理者
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实现,人们不应该