从数据库中获取对象在 Symfony 4 中不起作用
Fetching Objects from the Database don't work in Symfony 4
我在 symfony 中使用 find() 方法时遇到问题 :
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't10.id' in 'on clause'
它只适用于特定的 Entity ,对于其他 Entity 来说效果很好。
这是我的代码:
$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;
}
}
我搜索了错误,但大多数 post 说这是因为主键不是 id,但在我的例子中主键是 id。我还尝试使用方法 findBy() 获取对象并使用 id 以外的其他参数,但我遇到了同样的错误。
我的完整代码:
class : http://www.pastebin.com/r7hREPYD , the repository : http://www.pastebin.com/Mp118dQt , the controller : http://www.pastebin.com/q29UnyGd
尝试使用 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
之后再试一次。
首先,你没有直接使用 $_POST,但你必须那样使用 Request。
public function foo(Request $request): void {
$classId = $request->request->get('classId');
$classe = $this->getDoctrine()
->getRepository(Product::class)
->find($classId);
...
}
也许您的未清理 ID 是问题所在。
你可以尝试用class的repo作为形参写一个方法
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.
请尝试编写一个存储库函数。只是为了理解问题。
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();
}
你使用 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');
}
我在代码中留下了一些注释。
关于此函数的最后一行,强制登录可以由 config/packages/security.yaml
中的 Symfony 防火墙处理
Symfony Security
Symfony access control
请先更正您的代码。
你会注意到我在你的代码中留下了一个转储,取消注释,并检查 classeid
是否是一个有效值。
查看异常日志,这很可能是您出错的原因
[编辑]
只是为了确保,请 运行 以下命令:
php bin/console make:migration
php bin/console doctrine:migrations:migrate
错误来自与实体的错误关联。所以我删除了实体和所有关联并重新创建 class 现在它正在工作。
我在 symfony 中使用 find() 方法时遇到问题 :
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't10.id' in 'on clause'
它只适用于特定的 Entity ,对于其他 Entity 来说效果很好。
这是我的代码:
$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;
}
}
我搜索了错误,但大多数 post 说这是因为主键不是 id,但在我的例子中主键是 id。我还尝试使用方法 findBy() 获取对象并使用 id 以外的其他参数,但我遇到了同样的错误。 我的完整代码:
class : http://www.pastebin.com/r7hREPYD , the repository : http://www.pastebin.com/Mp118dQt , the controller : http://www.pastebin.com/q29UnyGd
尝试使用 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
之后再试一次。
首先,你没有直接使用 $_POST,但你必须那样使用 Request。
public function foo(Request $request): void {
$classId = $request->request->get('classId');
$classe = $this->getDoctrine()
->getRepository(Product::class)
->find($classId);
...
}
也许您的未清理 ID 是问题所在。
你可以尝试用class的repo作为形参写一个方法
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.
请尝试编写一个存储库函数。只是为了理解问题。
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();
}
你使用 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');
}
我在代码中留下了一些注释。
关于此函数的最后一行,强制登录可以由 config/packages/security.yaml
Symfony Security
Symfony access control
请先更正您的代码。
你会注意到我在你的代码中留下了一个转储,取消注释,并检查 classeid
是否是一个有效值。
查看异常日志,这很可能是您出错的原因
[编辑] 只是为了确保,请 运行 以下命令:
php bin/console make:migration
php bin/console doctrine:migrations:migrate
错误来自与实体的错误关联。所以我删除了实体和所有关联并重新创建 class 现在它正在工作。