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();
}
}
私の経験から、これらの4つのエンティティがほとんど同じ場合、必要なすべての属性のスーパーセットで1つのデータベーステーブルを使用し、Doctrineで1つのエンティティを使用し、データベースレベルではなくアプリケーションレベルで異なる処理を解決することをお勧めします。後であなたは、誰かが例えばPersonalとCaretakerの両方であること、そして構造化されたソリューションの問題が始まることを知ります。 – Miro
@Miroありがとうございました。これを扱う簡単な方法のように聞こえます。 – Mathias