Doctrine Abstract - 具体类 ORM

Posted

技术标签:

【中文标题】Doctrine Abstract - 具体类 ORM【英文标题】:Doctrine Abstract - Concrete class ORM 【发布时间】:2016-12-10 02:17:40 【问题描述】:

我正在使用原则将某些对象映射到数据库表。 这就是我现在拥有的:

使用 Doctrine\ORM\Mapping 作为 ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="account")
 */
abstract class Account
   /**
   * @ORM\Id
   * @ORM\Column(type="string")
   */
   private $username;

   /**
   * @ORM\Id
   * @ORM\Column(type="string")
   */
   private $password;

   /*Getters and setters*/


 /**
 * @ORM\Entity
 * @ORM\Table(name="player")
 */
abstract class Player extends Account

   /**
   * @ORM\Id
   * @ORM\Column(type="integer")
   */
   private $number;

   /*Getters and setters*/



 /**
 * @ORM\Entity
 * @ORM\Table(name="coach")
 */
abstract class Coach extends Account

   /**
   * @ORM\Id
   * @ORM\Column(type="integer")
   */
   private $experience;

   /*Getters and setters*/

这样,所有具体类都将具有用户名和密码列,如果我只需要存储用户名以便以后能够加入它们并取回 oconcrete 对象怎么办?提前致谢。

【问题讨论】:

无法理解您的需求,但映射的超类可能会有所帮助:docs.doctrine-project.org/projects/doctrine-orm/en/latest/… 我需要保存 Account Class 和子类的原因是因为稍后我需要让他们交换一些消息,并且我很难创建一个包含发送者和接收者字段的消息实体帐户表中用户名的 2 个外键。 我只能说您似乎过于关注数据库设计,即反复提及外键和表。 Doctrine 是一个 ORM,旨在抽象出实际的持久性过程。设计您的实体以适合您的用例,然后担心数据库映射。 【参考方案1】:

你想要的可能是http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#class-table-inheritance中描述的类表继承

namespace MyProject\Model;

/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap("player" = "Player", "coach" = "Coach")
 */
abstract class Account

    // ...


/** @Entity */
class Player extends Account

    // ...


/** @Entity */
class Coach extends Account

    // ...

这应该会创建 3 个表 AccountPlayerCoach,尽管不能单独保留 Account,而是它将有一个鉴别器列 + ID 链接到。所以,例如'coach' '3' 将加入 id 为 3 的 Coach 对象。

第一个答案: 如果我理解正确,不需要直接提供密码,可以添加到$password注解

 * @ORM\Column(type="string", nullable=true)

这是你的想法吗?

【讨论】:

不,我正在尝试使用用户名和密码保存帐户表,但玩家和所有子类只使用帐户的用户名外键,以便能够进行加入稍后。 我需要保存 Account Class 和子类的原因是因为稍后我需要让他们交换一些消息,并且我很难创建一个包含发送者和接收者字段的消息实体帐户表中用户名的 2 个外键。

以上是关于Doctrine Abstract - 具体类 ORM的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象之抽象类abstract 入门实例

关于Abstract,static,final的理解

抽象类abstract

抽象 & abstract关键字

abstract

C++ 抽象类 (abstract class)