Как отобразить данные объектов наследия в виде веточек? - PullRequest
0 голосов
/ 11 июня 2019

Я использую Symfony 3.4 со встроенными формами в модале Bootstrap и создал наследование с абстрактной родительской сущностью (USER) и двумя дочерними сущностями (EMPLOYER и SEASONAL, где поля идентификаторов закомментированы для использования USER), который расширяет ПОЛЬЗОВАТЕЛЬ тремя объектами ЗАЩИЩЕННЫХ полей.

На моем сайте, с точки зрения моей ветки modalForm, мне удается зарегистрироваться на базе моих разных типов пользователей Employer или Seasonal через мой SecurityController.

После завершения записи я перенаправляю в представление ветки userAccount, URL-адрес которого получает данные, отправленные при создании пользователя: MySeason / {role} / {id} / my-account и UserAccountController, который должен восстановить отправленные данные. ранее и отображать их, вот когда я сталкиваюсь с ошибкой:

Произошла исключительная ситуация при выполнении 'SELECT t1.id AS id_2, t1.email AS email_3, t1.password AS пароль_4, t1.registration AS registration_5, t1.company AS company_6, t1.contact AS contact_7, t1 .role AS role_8 ОТ работодателя t1 ГДЕ t0.id =? ' с параметрами ["1"]: SQLSTATE [42S22]: столбец не найден: 1054 Поле 't0.id' неизвестно в предложении where

Я думаю, что в ошибке symfony путает t1.id дочерней сущности и t0.id родительской сущности.

Если у кого-нибудь есть решение предложить мне! ; -)

Моя родительская сущность

...
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="P6\GeneralBundle\Repository\UserRepository")
*/
abstract class User
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @var string
*
* @ORM\Column(name="email", type="string", length=255)
*/
protected $email;

/**
* @var string
*
* @ORM\Column(name="password", type="string", length=255)
*/
protected $password;
...

Моя дочерняя сущность

...
/**
* Employer
*
* @ORM\Table(name="employer")
* @ORM\Entity(repositoryClass="P6\GeneralBundle\Repository\EmployerRepository")
*/
class Employer extends User
{
const ROLE_USER = 'EMPLOYER';

// /**
// * @var int
// *
// * @ORM\Column(name="id", type="integer")
// * @ORM\Id
// * @ORM\GeneratedValue(strategy="AUTO")
// */
// protected $id;

/**
* @var string
*
* @ORM\Column(name="company", type="string", length=255)
*/
protected $company;

/**
* @var string
*
* @ORM\Column(name="contact", type="string", length=255)
*/
protected $contact;
...

Мой SecurityController

<?php

namespace P6\GeneralBundle\Controller;

use P6\GeneralBundle\Entity\Seasonal;
use P6\GeneralBundle\Form\SeasonalType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use P6\GeneralBundle\Entity\Employer;
use P6\GeneralBundle\Form\EmployerType;

class SecurityController extends Controller
{

public function userRegistrationAction (Request $request)
 {
 // Employer Form

$employer = new Employer();

 if ($formEmployer = $this->createForm(EmployerType::class, $employer, array('action' => $this->generateUrl('registerUser')
 ))) {

$formEmployer->handleRequest($request);

if ($formEmployer->isSubmitted() && $formEmployer->isValid()) {
/** @var Employer $employer */
$employer = $formEmployer->getData();
$em = $this->getDoctrine()->getManager();
$em->persist($employer);
$em->flush();

$this->addFlash('registration', 'Votre profil a bien été enregistré !');

return $this->redirectToRoute('user_account', [
'role' => $employer->getRole(),
'id' => $employer->getId(),
]);
}
}

// Seasonal Form

$seasonal = new Seasonal();

 if ($formSeasonal = $this->createForm(SeasonalType::class, $seasonal, array('action' => $this->generateUrl('registerUser')
 ))) {

$formSeasonal->handleRequest($request);

if ($formSeasonal->isSubmitted() && $formSeasonal->isValid()) {
/** @var Seasonal $seasonal */
$seasonal = $formSeasonal->getData();
$em = $this->getDoctrine()->getManager();
$em->persist($seasonal);
$em->flush();

$this->addFlash('registration', 'Votre profil a bien été enregistré !');

return $this->redirectToRoute('user_account', [
'role' => $seasonal->getRole(),
'id' => $seasonal->getId(),
]);
}
}

 // Renvoi de vue si les formulaires ne sont pas valides

return $this->render('@General/Default/modalForm.html.twig', [
'formEmployer' => $formEmployer->createView(),
'formSeasonal' => $formSeasonal->createView(),
]);
}
}

Мой UserAccountController

<?php

namespace P6\GeneralBundle\Controller;

use P6\GeneralBundle\Entity\Employer;
use P6\GeneralBundle\Entity\Seasonal;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class UserAccountController extends Controller
{
public function userAccountAction(Employer $employer, Seasonal $seasonal)
 {
$repository = $this->getDoctrine()->getRepository('GeneralBundle:Employer');
$employer = $repository->findBy(['employer' => $employer->getId()]);

//        if ($repository = $this->getDoctrine()->getRepository('GeneralBundle:Seasonal')) {
//            $seasonal = $repository->findBy(['seasonal' => $seasonal->getId()]);
//        }

return $this->render('@General/Default/userAccount.html.twig', [
'employer' => $employer,
//'seasonal' => $seasonal,
]);

}
}

Я уже пробовал 3 способа расширения класса (сопоставленный суперкласс, отдельная таблица и таблица классов), но это не решает мою проблему. Я ожидаю, что смогу восстановить данные, сохраненные в базе данных, и отобразить их в виде веточек.

1 Ответ

0 голосов
/ 21 июня 2019

Я нашел решение по этой ссылке ( Сохранение наследования Symfony2-Doctrine2 не работает должным образом ), я наконец могу восстановить данные, отправленные при регистрации от Пользователя, до следующего просмотра, учетной записи Пользователя!

Фактически мне пришлось добавить этот фрагмент кода в параметры моего материнского класса:

* @ORM \ InheritanceType ("JOINED")
* @ORM \ DiscriminatorColumn (name = "discr", type = "string")
* @ORM \ DiscriminatorMap ({"employer" = "Employer", "seasonal" = "Seasonal"})

Но также изменить идентификатор получателя для дочерних сущностей, заменив:

public function getId (){return $ this-> id;}

на:

public function getId (){return parent :: getId ();}

И, наконец, я заменил в своем UserAccountController:

$ repository = $ this-> getDoctrine () -> getRepository ('GeneralBundle: Employer');
$ employer = $ repository-> findBy (['employer' => $ employer-> getId ()]);

на:

$ repository = $ this-> getDoctrine () -> getRepository ('GeneralBundle: Employer');
$ employer = $ repository-> findOneBy (['id' => $ employer-> getId ()]);

Надеясь, что это решение незаблокируй меня на отдых;)

...