im новое для доктрины и ORM в целом.Наследование доктрины и типы пользователей
У меня есть 4 пользовательских типа (Admin, Caretaker, Child, Personal). Все они получили некоторые из тех же столбцов (идентификатор, имя, почта, пароль, созданная, тип & группы) и они получили несколько столбцов специальных для каждого из них (Сторож имеет ребенка 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 сущности в основном одинаковы, я предлагаю использовать одну таблицу базы данных с надмножеством всех необходимых атрибутов и использовать одну сущность в Доктрине и решать различную обработку на уровне приложений, а не на уровне базы данных. Обычно позже вы узнаете, что кто-то, например, как Personal, так и Caretaker, а затем начинаются проблемы со структурированным решением ... – Miro
@Miro Спасибо, никогда не думал об этом, звучит как более простой способ справиться с этим. – Mathias