Symfony:如何从与 oneToMany 关系相关的实体中获取所有对象数据
Symfony : How to fetch all object data from entity related with oneToMany relationship
我有与 oneToMany 关系相关的“汽车”和“预订”实体:
<?php
namespace App\Entity;
/**
* @ORM\Entity(repositoryClass=CarRepository::class)
* @UniqueEntity("registrationNumber")
* @Vich\Uploadable
*/
class Car
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Length(min=3, max=9)
*/
private $registrationNumber;
/**
* @ORM\OneToMany(targetEntity=Booking::class, mappedBy="car")
*/
private $bookings;
/**
* @return Collection|Booking[]
*/
public function getBookings(): Collection
{
return $this->bookings;
}
}
<?php
namespace App\Entity;
/**
* @ORM\Entity(repositoryClass=BookingRepository::class)
*/
class Booking
{
const STATUS = [
0 => 'Pending',
1 => 'Canceled',
2 => 'Confirmed',
3 => 'Approved',
];
public function __construct()
{
$this->request_date = new \DateTime('now');
}
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Car::class, inversedBy="bookings")
* @ORM\JoinColumn(nullable=false)
*/
private $car;
/**
* @ORM\Column(type="string", length=255, options={"default": "Pending"})
*/
private $status = self::STATUS[0];
public function getCar(): ?Car
{
return $this->car;
}
public function setCar(?Car $car): self
{
$this->car = $car;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function getBookingStatus(): ?string
{
return self::STATUS[$this->status];
}
public function setStatus(string $status): self
{
$this->status = $status;
return $this;
}
}
public function book(Request $request, Car $car)
{
$booked_car = $car;
$booking = new Booking();
$booking->setCar($booked_car);
$form = $this->createForm(BookingType::class, $booking);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$booking = $form->getData();
$this->em->persist($booking);
$this->em->flush();
$this->addFlash('success', 'Démande envoyée avec success');
return $this->redirectToRoute('car.index');
}
$this->addFlash('error', 'une erreur dans le système');
return $this->render('booking/book.html.twig',[
'booking' => $booking,
'form' => $form->createView()
]);
}
当dump $booking 变量到twig 或列出所有预订的索引页时,booking 对象中的每个car 对象只有id 字段,其他为空!我想获取与预订相关的汽车对象的每个字段,以便在树枝视图中显示它!在方法书中,我获取了随请求发送的 id 变量,并将其与 setCar 方法一起使用,我是否应该创建一个查询来搜索 byId 并逐个影响每个属性!!
这种关系默认是懒加载的。因此,由于您没有调用 car 对象的任何 getter,因此您只显示了 id(因为它也存储在 booking 对象中)。
但这仅在转储的上下文中,一旦您尝试使用汽车的 getter(getId 除外),它将加载其余部分。
如果您确实需要将整个汽车数据与预订数据一起加载,您可以在 ManyToOne 关系中使用 fetch="EAGER"
,但您需要有正当理由才能这样做。
我有与 oneToMany 关系相关的“汽车”和“预订”实体:
<?php
namespace App\Entity;
/**
* @ORM\Entity(repositoryClass=CarRepository::class)
* @UniqueEntity("registrationNumber")
* @Vich\Uploadable
*/
class Car
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Length(min=3, max=9)
*/
private $registrationNumber;
/**
* @ORM\OneToMany(targetEntity=Booking::class, mappedBy="car")
*/
private $bookings;
/**
* @return Collection|Booking[]
*/
public function getBookings(): Collection
{
return $this->bookings;
}
}
<?php
namespace App\Entity;
/**
* @ORM\Entity(repositoryClass=BookingRepository::class)
*/
class Booking
{
const STATUS = [
0 => 'Pending',
1 => 'Canceled',
2 => 'Confirmed',
3 => 'Approved',
];
public function __construct()
{
$this->request_date = new \DateTime('now');
}
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Car::class, inversedBy="bookings")
* @ORM\JoinColumn(nullable=false)
*/
private $car;
/**
* @ORM\Column(type="string", length=255, options={"default": "Pending"})
*/
private $status = self::STATUS[0];
public function getCar(): ?Car
{
return $this->car;
}
public function setCar(?Car $car): self
{
$this->car = $car;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function getBookingStatus(): ?string
{
return self::STATUS[$this->status];
}
public function setStatus(string $status): self
{
$this->status = $status;
return $this;
}
}
public function book(Request $request, Car $car)
{
$booked_car = $car;
$booking = new Booking();
$booking->setCar($booked_car);
$form = $this->createForm(BookingType::class, $booking);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$booking = $form->getData();
$this->em->persist($booking);
$this->em->flush();
$this->addFlash('success', 'Démande envoyée avec success');
return $this->redirectToRoute('car.index');
}
$this->addFlash('error', 'une erreur dans le système');
return $this->render('booking/book.html.twig',[
'booking' => $booking,
'form' => $form->createView()
]);
}
当dump $booking 变量到twig 或列出所有预订的索引页时,booking 对象中的每个car 对象只有id 字段,其他为空!我想获取与预订相关的汽车对象的每个字段,以便在树枝视图中显示它!在方法书中,我获取了随请求发送的 id 变量,并将其与 setCar 方法一起使用,我是否应该创建一个查询来搜索 byId 并逐个影响每个属性!!
这种关系默认是懒加载的。因此,由于您没有调用 car 对象的任何 getter,因此您只显示了 id(因为它也存储在 booking 对象中)。 但这仅在转储的上下文中,一旦您尝试使用汽车的 getter(getId 除外),它将加载其余部分。
如果您确实需要将整个汽车数据与预订数据一起加载,您可以在 ManyToOne 关系中使用 fetch="EAGER"
,但您需要有正当理由才能这样做。