Как изменить родительский объект на унаследованном объекте в Symfony4 Doctrine - PullRequest
0 голосов
/ 25 марта 2020

У меня есть несколько типов сущностей, которые расширяют друг друга для создания моей модели. В моем приложении мне нужно управлять Interimaries, Employes и Users.

. В компании работает Interimary, как и Employe. Пользователь в Employe моего приложения с доступом к приложению.

Моя модель определена следующим образом:

Рабочий:

<?php

/**
 * @ORM\Entity(repositoryClass="App\Repository\User\WorkerRepository")
 * @ORM\Table(name="usr_worker")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"worker" = "Worker", "employe" = "Employe", "interimary" = "Interimary", "user" = "User"})
 */
class Worker
{
    private $id;
}

Interimary:

<?php

/**
 * @ORM\Entity(repositoryClass="App\Repository\User\InterimaryRepository")
 * @ORM\Table(name="usr_interimary")
 */
class Interimary extends Worker{}

Сотрудник:

<?php

/**
 * @ORM\Entity(repositoryClass="App\Repository\User\EmployeRepository")
 * @ORM\Table(name="usr_employe")
 */
class Employe extends Worker{}

Пользователь:

<?php

/**
 * @ORM\Entity(repositoryClass="App\Repository\User\UserRepository")
 * @ORM\Table(name="usr_user")
 * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
 * @ORM\HasLifecycleCallbacks()
 */
class User extends Employe implements UserInterface
{
    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $username;


    /**
     * @var string The hashed password
     * @ORM\Column(type="string", nullable=true)
     */
    private $password;
}

Все мои логины аутентификации c находятся в моем классе User. Логика c моего приложения заключается в том, что при первом входе пользователя в систему он должен выбрать в раскрывающемся списке Сотрудника, к которому он присоединен.

Проблема : у меня есть Employe сущность и User сущность, которую я хочу "объединить", когда пользователь выбирает сотрудника.

Решение? : Моей первой идеей было изменить User ID, чтобы он соответствовал моему Employe ID, а затем удалить старого сотрудника пользователя, но это не работает. Я не уверен, что подход плох, но я понятия не имею, что не работает с этим методом.

/**
 * @Route("/user/linkemploye", name="user_employe_link")
 */
public function linkUserEmploye(Request $request)
{
    $user       = $this->getUser();
    $employes   = $this->employeRepository->findUnlincked();

    if($request->isMethod('POST')){

        $idEmploye = $request->request->get('employe');

        $employe        = $this->employeRepository->find($user->getId());
        $intoEmploye    = $this->employeRepository->find($idEmploye);

        $this->mergeEmployes($employe, $intoEmploye);

        $user->setUserLincked(true);

        $em = $this->getDoctrine()->getManager();
        $em->persist($user);
        $em->flush();

        return $this->redirectToRoute('app_homepage');
    }

    return $this->render('app/users/security/UserEmployeLink/userEmployeLink.html.twig', [
        "employes" => $employes
    ]);
}

public function mergeEmployes(Employe $employe, Employe $intoEmploye){
    //How to properly merge my 2 entities ?
}
...