Symfony:如何从与oneToMany关系相关的实体中获取所有对象数据

时间:2020-09-12 09:39:54

标签: php symfony doctrine-orm one-to-many

我有与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()
        ]);
    }

当在列出所有预订的树枝或索引页面中转储$ booking变量时,预订对象中的每个汽车对象都只有id字段,其他则为null!我想获取与预订有关的汽车对象的每个字段的完整数据,以在树枝视图中显示它!在方法书中,我获得了随请求发送的id变量,并使用setCar方法将其放入,应该创建一个查询byId并逐个影响每个属性的查询!

dump image

1 个答案:

答案 0 :(得分:1)

默认情况下,这种关系处于延迟加载状态。因此,由于您没有调用汽车对象的任何吸气剂,因此只显示了ID(因为它也存储在预订对象中)。 但这仅是在转储的上下文中,一旦您尝试使用汽车的吸气剂(getId除外),它将加载其余的。

如果您确实需要将整个汽车数据与预订数据一起加载,可以在ManyToOne关系中使用fetch="EAGER",但是您需要有充分的理由这样做。