Обновление столбца дискриминатора 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, который легко обрабатывает сопоставление. Этот пакет также позволяет вашим пользователям зарегистрироваться в соответствующем профиле.

Другие вопросы по тегам