Обновление столбца дискриминатора Doctrine2 с помощью Symfony2
У меня есть сущность под названием User
который имеет наследство для Student
, Professional
а также Business
,
Когда пользователь зарегистрирован, только User
но они должны обновить свой профиль и выбрать, какой тип пользователя, у меня есть форма, которая обрабатывает это, контроллер, который получает данные формы, но я не могу обновить поле дискриминатора type
с $userEntity->setType()
Это мой картографический материал
class User
{
const TYPE_BASIC = "Basico";
const TYPE_STUDENT = "Estudiante";
const TYPE_PROFESSIONAL = "Profesional";
const TYPE_BUSINESS = "Empresa";
protected $type = self::TYPE_BASIC;
public function getType()
{
return self::TYPE_BASIC;
}
public function setType($type)
{
$this->type = $type;
}
class Student extends User
{
protected $type = self::TYPE_STUDENT;
А потом Профессионал и Бизнес точно так же, как Студент (смена констант)
<entity name="User" table="user_base" inheritance-type="JOINED">
<discriminator-column name="type" type="string"/>
<discriminator-map>
<discriminator-mapping value="Basico" class="User"/>
<discriminator-mapping value="Estudiante" class="Student"/>
<discriminator-mapping value="Profesional" class="Professional"/>
<discriminator-mapping value="Empresa" class="Business"/>
</discriminator-map>
дочерние таблицы названы user_xxx
где xxx = Student/Professional/Business
А это мой контроллер
if($form->isValid())
{
$em = $this->getDoctrine()->getManager();
$data = $form->all();
$type = $data['type']->getData();
$email = $data['email']->getData();
$profile = $data['profile']->all();
$name = $profile['name']->getData();
$lastName = $profile['lastName']->getData();
$birth = $profile['birth']->getData();
$profileEntity = new Profile();
$profileEntity->setBirth($birth);
$profileEntity->setName($name);
$profileEntity->setLastName($lastName);
$profileEntity->setUser($user);
$em->persist($profileEntity);
ladybug_dump($type);
$userEntity = $em->getRepository('User')->find($user);
$userEntity->setProfile($profileEntity);
$userEntity->setType($type);
if($user->getEmail() != $email)
$userEntity->setEmail($email);
$em->persist($userEntity);
$em->flush();
}
Все сохраняется, но type
поле, которое остается его исходными данными. Я знаю, когда я изменяю столбец дискриминатора, мне нужно создать новую строку внутри его дочернего элемента, но сначала я хочу узнать, как изменить столбец дискриминатора.
1 ответ
Это возможно, если вы используете этот настраиваемый фрагмент кода в форме характеристики, которую вы можете использовать в репозитории.
Черта:
namespace App\Doctrine\Repository;
use App\Exception\InvalidDiscriminatorClassException;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DBALException;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\ClassMetadata;
/**
* Discriminator Trait
*/
trait DiscriminatorTrait
{
/**
* @return ClassMetadata
*/
abstract public function getClassMetadata();
/**
* @return EntityManager
*/
abstract public function getEntityManager();
/**
* Update Discriminator Column
*
* @param integer $id
* @param string $class
* @return boolean
* @throws InvalidDiscriminatorClassException
*/
private function updateDiscriminatorColumn($id, $class)
{
/* @var ClassMetadata $classMetadata */
$classMetadata = $this->getClassMetadata();
if (!in_array($class, $classMetadata->discriminatorMap)) {
throw new InvalidDiscriminatorClassException($class);
}
$identifier = $classMetadata->fieldMappings[$classMetadata->identifier[0]]["columnName"];
$column = $classMetadata->discriminatorColumn["fieldName"];
$value = array_search($class, $classMetadata->discriminatorMap);
/* @var Connection $connection */
$connection = $this->getEntityManager()->getConnection();
try {
$connection->update(
$classMetadata->table["name"],
[$column => $value],
[$identifier => $id]
);
}
catch (DBALException $e) {
return false;
}
return true;
}
}
Согласно документации Doctrine для отображения наследования, невозможно ни получить, ни установить тип. Вы можете воспользоваться преимуществом https://github.com/PUGX/PUGXMultiUserBundle, который легко обрабатывает сопоставление. Этот пакет также позволяет вашим пользователям зарегистрироваться в соответствующем профиле.