2016-08-10 2 views
1

Использование Exemple предоставленной доктрины documentationдоктрина: Класс Таблица Наследование: Добавление существующего объекта из родительской таблицы к расширенной таблице

<?php 
namespace MyProject\Model; 

/** 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"}) 
*/ 
class Person 
{ 
    // ... 
} 

/** @Entity */ 
class Employee extends Person 
{ 
    // ... 
} 

Если предположить, что у меня есть существующий объект Person. Я хочу продвинуть этого Человека как Сотрудника. Я не могу найти способ сделать это. Я попытался добавить отношения OneToOne и создать методы setPerson или setUser.

$employee = new Employee(); 
$employee->setRole('ROLE_EMPLOYEE'); 
$employee->setPerson($person); 

ИЛИ

$employee = new Employee(); 
$employee->setRole('ROLE_EMPLOYEE'); 
$person->setEmployee($employee); 

Конечно я не смог сделать эту работу и не может найти другой способ сделать это. Единственный способ, который может работать, - удалить человека объекта и создать нового сотрудника с данными предыдущего человека.

Какие-либо подсказки или решения?

+1

я столкнулся с той же проблемой, и я решил сделать это с сырыми запросов SQL ... изменение DISCR вручную – Alsatian

+0

@Alsatian Спасибо. Я даже об этом тоже. Хорошо, что вам это удается. Я сделаю это, ожидая другого решения, если он есть. Если вы хотите опубликовать его в качестве ответа, я буду рад его продвигать. – Brieuc

ответ

1

Доктрина Dont позволяют изменять типы на лету, почему ?:

если и создать объект Person его должно быть лицо до конца, к примеру, если работник будет иметь некоторые дополнительные поля и и будет понизить его к лицу, , утеряны поля Employee. Вот почему u должен создать новый объект.

Наследование было создано только для того, чтобы нанести на карту ООП Наследование базы данных, использовать его, если у вас есть дополнительные поля в дочернем объекте.

Но если и по-прежнему хотят изменить DISCR у может использовать:

$em->getConnection()->exec("UPDATE Person SET discr = 'employee' WHERE id = ".$entity->getId()); 
+0

Хорошо, спасибо за ответ. но затем на следующем шаге используются необработанные SQL-запросы, упомянутые @Alsatian для создания пользователя в таблице сотрудников, не так ли? – Brieuc