Я использую 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 способа расширения класса (сопоставленный суперкласс, отдельная таблица и таблица классов), но это не решает мою проблему.
Я ожидаю, что смогу восстановить данные, сохраненные в базе данных, и отобразить их в виде веточек.