2016-05-15 4 views
0

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(); 
    } 
} 
+1

Из моего опыта: если эти 4 сущности в основном одинаковы, я предлагаю использовать одну таблицу базы данных с надмножеством всех необходимых атрибутов и использовать одну сущность в Доктрине и решать различную обработку на уровне приложений, а не на уровне базы данных. Обычно позже вы узнаете, что кто-то, например, как Personal, так и Caretaker, а затем начинаются проблемы со структурированным решением ... – Miro

+0

@Miro Спасибо, никогда не думал об этом, звучит как более простой способ справиться с этим. – Mathias

ответ

1

Вы можете легко решить эту проблему с доктриной и InheritanceType отображения.

В принципе, вы можете сделать что-то вроде этого:

/** 
* @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 различных классов,

// 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(); 
    } 
} 

Доктрина документы действительно хорошо для этой проблемы: http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

И вам не нужна дополнительная проверка при входе в систему, потому что доктрина автоматически создает правильный класс для вас.

+0

Забыл, чтобы получить ответ, комментарий Миро помог мне достичь этого решения. , но теперь theres ответ для других в той же ситуации, чтобы увидеть Спасибо – Mathias

Смежные вопросы