2016-05-15 12 views
0

DoctrineとORMの一般的な新機能です。Doctrineの継承とユーザータイプ

私は4つのユーザータイプ(Admin、Caretaker、Child、Personal)があります。 彼らは皆、同じ列(ID、名前、メール、パスワード、作成された、タイプ&グループ) のいくつかを持って、彼らは彼らのそれぞれに特別ないくつかの列を(世話人は、子のIDなどを持っている)

Iましたどのように私はこれをマップする必要がありますかかなり分かりません。 私のユーザータイプをユーザーに拡張し、子テーブルにユーザーの列を渡すか、ここでベストプラクティスを実行する必要がありますか?

私は、拡張機能を使用してログインを行う際に何らかの作業を余儀なくされると想定していますか?

User.php

/** 
* @MappedSuperclass 
* @Entity @Table(name="users") 
*/ 
class User 
{ 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var int 
    **/ 
    protected $id; 
    /** 
    * @Column(type="string") 
    * @var string 
    **/ 
    protected $name; 
    /** 
    * @Column(type="string") 
    * @var string 
    **/ 
    protected $mail; 
    /** 
    * @Column(type="string") 
    * @var string 
    **/ 
    protected $password; 
    /** 
    * @Column(type="datetime") 
    **/ 
    protected $created; 
    /** 
    * @Column(type="datetime") 
    **/ 
    protected $lastlogin; 
    /** 
    * @ManyToOne(targetEntity="Group") 
    * @JoinColumn(name="group_id", referencedColumnName="id") 
    */ 
    protected $group; 

    /** 
    * @ManyToOne(targetEntity="Type") 
    * @JoinColumn(name="type_id", referencedColumnName="id") 
    */ 
    protected $type; 

    public function __construct() {} 

    public function getId() { return $this->id; } 

    public function getName() { return $this->name; } 

    public function getMail() { return $this->mail; } 

    public function getCreated() { return $this->mail; } 

    public function getLastLogin() { return $this->lastlogin; } 

    public function getGroup() { return $this->group; } 

    public function getType() { return $this->type; } 

    public function setName($name) { $this->name = $name; } 

    public function setMail($mail) { $this->mail = $mail; } 

    public function setCreated() { $this->created = new DateTime("now"); } 

    public function setLastLogin() { $this->lastlogin = new DateTime("now"); } 

    public function setGroup($group) { $this->group = $group; } 

    public function setType($type) { $this->type = $type; } 
} 

Child.php

// src/Child.php 
use Doctrine\Common\Collections\ArrayCollection; 
/** 
* @Entity @Table(name="child") 
*/ 
class Child extends User 
{ 
    /** 
    * @Id @OneToOne(targetEntity="User") 
    * @JoinColumn(name="id", referencedColumnName="id") 
    **/ 
    protected $id; 
    /** 
    * @Column(type="string") 
    */ 
    protected $image; 
    /** 
    * @ManyToMany(targetEntity="User") 
    * @JoinTable(name="child_Contacts", 
    *  joinColumns={@JoinColumn(name="child_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="contact_id", referencedColumnName="id")} 
    *  ) 
    */ 
    protected $currentContacts; 
    /** 
    * @OneToMany(targetEntity="Alarm", mappedBy="child") 
    */ 
    protected $alarms; 

    public function __construct() 
    { 
     $this->alarms = new ArrayCollection(); 
    } 
} 
+1

私の経験から、これらの4つのエンティティがほとんど同じ場合、必要なすべての属性のスーパーセットで1つのデータベーステーブルを使用し、Doctrineで1つのエンティティを使用し、データベースレベルではなくアプリケーションレベルで異なる処理を解決することをお勧めします。後であなたは、誰かが例えばPersonalとCaretakerの両方であること、そして構造化されたソリューションの問題が始まることを知ります。 – Miro

+0

@Miroありがとうございました。これを扱う簡単な方法のように聞こえます。 – Mathias

答えて

1

あなたは簡単に教義とInheritanceTypeマッピングでこの問題を解決することができます。 http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

// src/Child.php 
use Doctrine\Common\Collections\ArrayCollection; 
/** 
* @Entity @Table(name="child") 
*/ 
class Child extends User 
{ 
    /** 
    * @Id @OneToOne(targetEntity="User") 
    * @JoinColumn(name="id", referencedColumnName="id") 
    **/ 
    protected $id; 
    /** 
    * @Column(type="string") 
    */ 
    protected $image; 
    /** 
    * @ManyToMany(targetEntity="User") 
    * @JoinTable(name="child_Contacts", 
    *  joinColumns={@JoinColumn(name="child_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="contact_id", referencedColumnName="id")} 
    *  ) 
    */ 
    protected $currentContacts; 
    /** 
    * @OneToMany(targetEntity="Alarm", mappedBy="child") 
    */ 
    protected $alarms; 

    public function __construct() 
    { 
     $this->alarms = new ArrayCollection(); 
    } 
} 

教義ドキュメント

は、この問題のために本当に良いです、そして

/** 
* @MappedSuperclass 
* @Entity @Table(name="users") 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"Admin" = "Admin", "Caretaker" = "Caretaker", "Child" = "Child", "Personal" = "Personal"}) 
*/ 
class User 
{ 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var int 
    **/ 
    protected $id; 
    /** 
    * @Column(type="string") 
    * @var string 
    **/ 
    protected $name; 
    /** 
    * @Column(type="string") 
    * @var string 
    **/ 
    protected $mail; 
    /** 
    * @Column(type="string") 
    * @var string 
    **/ 
    protected $password; 
    /** 
    * @Column(type="datetime") 
    **/ 
    protected $created; 
    /** 
    * @Column(type="datetime") 
    **/ 
    protected $lastlogin; 
    /** 
    * @ManyToOne(targetEntity="Group") 
    * @JoinColumn(name="group_id", referencedColumnName="id") 
    */ 
    protected $group; 
} 

そして、それぞれ4つの異なるクラスで:

基本的に、あなたはこのような何かを行うことができます

そして、doctrineが自動的に適切なクラスを作成するので、ログイン時に余分なチェックをする必要はありません。

+0

Miroのコメントは、この解決策にも役立ちました。 今、同じ状況の他の人のための答えがありがとう – Mathias