Извлечение объектов из базы данных не работает в Symfony 4 - PullRequest
0 голосов
/ 30 сентября 2019

У меня проблема, когда я использую метод find () в symfony:

PDOException: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 't10.id' в 'предложении'

Это только с определенной сущностью, с остальными это работает отлично.

Вот мой код:

$classeId = $_POST['classeid'];
                $repo = $this->getDoctrine()->getRepository(Classe::class);
                $classe = $repo->find($classeId);

и моя сущность:

 <?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ClasseRepository")
 */
class Classe
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Formation", inversedBy="classe")
     */
    private $formation;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Calendar", mappedBy="classe", cascade={"persist", "remove"})
     */
    private $calendar;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\person", inversedBy="classes")
     */
    private $responsable;

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

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getFormation(): ?Formation
    {
        return $this->formation;
    }

    public function setFormation(?Formation $formation): self
    {
        $this->formation = $formation;

        return $this;
    }

    public function __toString() {
        return $this->name;
    }

    public function getCalendar(): ?Calendar
    {
        return $this->calendar;
    }

    public function setCalendar(?Calendar $calendar): self
    {
        $this->calendar = $calendar;

        // set (or unset) the owning side of the relation if necessary
        $newClasse = $calendar === null ? null : $this;
        if ($newClasse !== $calendar->getClasse()) {
            $calendar->setClasse($newClasse);
        }

        return $this;
    }

    public function getResponsable(): ?person
    {
        return $this->responsable;
    }

    public function setResponsable(?person $responsable): self
    {
        $this->responsable = $responsable;

        return $this;
    }
}

Я искал ошибку, но в большинстве сообщений говорится, что ее причиной является первичный ключ, а в моем случае первичный ключ - идентификатор. Я также пытался получить объект с помощью метода findBy () и использовать другие параметры, кроме идентификатора, но я получил ту же ошибку. Мой полный код:

класс: http://www.pastebin.com/r7hREPYD, хранилище: http://www.pastebin.com/Mp118dQt, контроллер: http://www.pastebin.com/q29UnyGd

Ответы [ 5 ]

1 голос
/ 30 сентября 2019

Неправильно работать с Symfony 4.
Использование напрямую $_POST, $_SERVER и т. Д. Не рекомендуется.

Вот как должна быть ваша функция newcalendar:

public function newcalendar(Request $request, JobRepository $jobRepository, ClasseRepository $classeRepository) {
    $user=$this->getUser();
    if($user) {
        $currentStep=$user->getStep();

        // Custom query result could be optimised
        $jobId=$this->getJobId($user->getId())[0]['job_id'];

        // Use Job repository instead
        // $repo = $this->getDoctrine()->getRepository(Job::class);
        $job=$jobRepository->find($jobId);

        //Do not override your object, create a new varaible instead, or use getter directly
        // $job=$job->getName();
        if($currentStep < 10) {
            return $this->redirectToRoute("registration$currentStep");
        }
        if($job->getName() == 1 || $job->getName() == 'admin' || $job->getName() == "responsable de formation" || $job->getName() == "consseiller") {

            // Do not use $_SERVER directly, may cause issues with fragments
            // if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            if($request->isMethod('POST')) {

                // Same reason as $_SERVER
                $calendar=new Calendar();
                // $calendar->setStartDate($_POST['start']);
                $calendar->setStartDate($request->request->get('start'));
                // $calendar->setEndDate($_POST['end']);
                $calendar->setEndDate($request->request->get('end'));
                // $calendar->setEvent($_POST['event']);
                $calendar->setEvent($request->request->get('event'));
                // $classeId=$_POST['classeid'];
                $classeId=$request->request->get('classeid'); // Not used

                // Uncomment to check this value
                // dump($request->request->get('classeid'));
                // exit();

                // Use Classe repository instead
                // $repo=$this->getDoctrine()->getRepository(Classe::class);
                // $classe=$repo->find($request->request->get('classeid'));
                $classe=$classeRepository->find($request->request->get('classeid'));

                //check if not null
                if($classe) {
                    $calendar->setClasse($classe);
                    $em=$this->getDoctrine()->getManager();
                    $em->persist($calendar);
                    $em->flush();
                }

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

            return $this->render("formation/newcalendar.html.twig");
        } else {
            return $this->render("dashboard/index.html.twig", array(
                'controller_name'=>'DashboardController',
            ));
        }
    }

    // Could be handled by firewall
    return $this->redirectToRoute('security_login');
}

Я оставил несколько комментариев в коде.

Что касается последней строки этой функции, принудительный вход в систему может обрабатываться брандмауэром Symfony в config/packages/security.yaml

Symfony Security
Контроль доступа Symfony

Сначала исправьте свой код. Вы заметите, что я оставил дамп в вашем коде, раскомментировал его и проверил, что classeid является допустимым значением.

Глядя на журнал исключений, это, скорее всего, причина вашей ошибки

[EDIT] Просто, чтобы убедиться, пожалуйста, выполните следующие команды:

php bin/console make:migration
php bin/console doctrine:migrations:migrate
1 голос
/ 30 сентября 2019

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

public function foo(Request $request): void {
   $classId = $request->request->get('classId');
   $classe = $this->getDoctrine()
        ->getRepository(Product::class)
        ->find($classId);

   ...
}

Возможно, проблема в вашем неанизированном идентификаторе.

ВыМожно попытаться написать метод с репо класса в качестве формального параметра.

public function foo(Request $request, ClasseRepository $repoClass): void {
      $repoClass->find($request->request->get('classId'));
      ...
}

Я хотел бы предложить вам принудительно ввести "classId" одним жестко закодированным.

$repoClass->find(1); // where 1 is a db you watched from db directly.

или

$repoCLass->findOneBy(['id'=> 1]); // where 1 is a well known unique identifier.
1 голос
/ 30 сентября 2019

Попробуйте найти с помощью namespace:

$classeId = $_POST['classeid'] ?? 1;

ИЛИ

$classeId = $request->request->get('classeid', 1);// По умолчанию ваш id = 1

$this->getDoctrine()->getRepository(App\Entity\Classe::class)->find($classeId);

И вам нужно обновить database:

doctrine:schema:update

после этой попыткиеще раз.

0 голосов
/ 01 октября 2019

Ошибка возникает из-за плохих ассоциаций с сущностью. Поэтому я удалил сущность и все ассоциации и заново создал класс, и теперь он работает.

0 голосов
/ 30 сентября 2019

пожалуйста, попробуйте написать функцию хранилища. Просто чтобы понять проблему.

public function findThisDamnId(int $id): array    {

    $qb = $this->createQueryBuilder('c')
        ->where('c.id > :val')
        ->setParameter('val',  $id)            
        ->getQuery();

    return $qb->execute();
}

или попробуйте стандарт SQL

public function getThisDamnClassFromId(int $Id): array {
$conn = $this->getEntityManager()->getConnection();

$sql = '
    SELECT * FROM classe c
    WHERE c.id > :val';
$stmt = $conn->prepare($sql);
$stmt->execute(['id' => $id]);


return $stmt->fetchAll();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...