es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cruzando múltiples entidades en EasyAdmin 3

Tengo 3 entidades y me gustaría obtener una propiedad de la entidad 1 en la entidad 3. Déjame explicarlo con mis clases:
“`php
class City
{
#[ORM\Column(type: 'string', length: 255)]
#[Assert\NotBlank]
#[Assert\Length(min: 1)]
private string $name;

<pre><code>#[ORM\Column(type: 'string', length: 20)]
#[Assert\NotBlank]
private string $code;
</code></pre>

<h1>[ORM\OneToOne(targetEntity: CityHomePage::class, cascade: ['persist', 'remove'])]</h1>

<pre><code>private CityHomePage $homePage;
</code></pre>

public function getHomePage(): CityHomePage
{
return $this->homePage;
}

<pre><code>public function setHomePage(CityHomePage $homePage): self
{
$this->homePage = $homePage;

return $this;
}
</code></pre>

}
<code>
</code>php
class CityHomePage
{
#[ORM\OneToOne(targetEntity: City::class, cascade: ['persist', 'remove'])]
#[ORM\JoinColumn(nullable: false)]
private City $city;

<pre><code>#[ORM\ManyToOne(targetEntity: Page::class, inversedBy: 'cityHomePages')]
#[ORM\JoinColumn(nullable: false)]
private Page $page;

#[ORM\OneToOne(targetEntity: Image::class, cascade: ['persist', 'remove'])]
private Image $image;

public function getCity(): ?City
{
return $this->city;
}

public function setCity(City $city): self
{
$this->city = $city;

return $this;
}

public function getPage(): ?Page
{
return $this->page;
}

public function setPage(?Page $page): self
{
$this->page = $page;

return $this;
}

public function getImage(): Image
{
return $this->image;
}

public function setImage(Image $image): self
{
$this->image = $image;

return $this;
}
</code></pre>

}
<code>
</code>php
class Page
{
#[ORM\Column(type: 'string', length: 100)]
#[Assert\Length(min: 1)]
private string $title;

<pre><code>/** @var Collection<int, CityHomePage> */
#[ORM\OneToMany(mappedBy: 'page', targetEntity: CityHomePage::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
private Collection $cityHomePages;

public function __construct()
{
parent::__construct();
$this->cityHomePages = new ArrayCollection();
}

public function getTitle(): ?string
{
return $this->title;
}

public function setTitle(string $title): self
{
$this->title = $title;

return $this;
}

/**
* @return Collection<int, CityHomePage>
*/
public function getCityHomePages(): Collection
{
return $this->cityHomePages;
}

public function addCityHomePage(CityHomePage $cityHomePage): self
{
if (!$this->cityHomePage->contains($cityHomePage)) {
$this->cityHomePage[] = $cityHomePage;
$cityHomePage->setPage($this);
}

return $this;
}

public function removeCityHomePage(CityHomePage $cityHomePage): self
{
if ($this->cityHomePage->removeElement($cityHomePage) && $cityHomePage->getPage() === $this) {
$cityHomePage->setPage(null);
}

return $this;
}
</code></pre>

}
“`

Creé un controlador CityCrud y en mi campo de configuración agregué:
“`php
public function configureFields(string $pageName): iterable
{
return [
TextField::new('name',$this->translator->trans('EA.name'))->onlyOnIndex(),
TextField::new('code')->onlyOnIndex(),
AssociationField::new('homePage', $this->translator->trans('EA.image'))->onlyWhenUpdating(),</p>

<pre><code> ];
}
</code></pre>

“`

Esto funciona, pero ahora necesito acceder desde mi controlador CityCrud a la propiedad ‘title’ de la entidad Page. ¿Existe alguna forma de cruzar múltiples entidades para obtener lo que necesito?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar el Repositorio de Entidades de Doctrine para unir varias entidades y recuperar los datos que necesitas. En tu caso, puedes crear un método personalizado en tu CityRepository así:

    public function findCityWithHomePageAndPageTitle($id)
    {
        $qb = $this->createQueryBuilder('c')
            ->select('c', 'h', 'p.title')
            ->leftJoin('c.homePage', 'h')
            ->leftJoin('h.page', 'p')
            ->where('c.id = :id')
            ->setParameter('id', $id);
    
        return $qb->getQuery()->getOneOrNullResult();
    }
    

    Este método une la entidad City con su entidad relacionada HomePage y la entidad Page para recuperar la propiedad del título. Luego puedes llamar a este método desde tu CityCrudControlador para obtener la entidad City con la HomePage y el título de Page relacionados:

    public function edit(EntityManagerInterface $entityManager, Request $request): Response
    {
        $id = $request->query->get('id');
        $cityRepository = $entityManager->getRepository(City::class);
        $city = $cityRepository->findCityWithHomePageAndPageTitle($id);
    
        // usar $city aquí para mostrar o actualizar los datos
    
        return parent::edit($entityManager, $request);
    }
    

    Ten en cuenta que puede que necesites ajustar el método y la consulta en función de tus necesidades específicas y el esquema de la base de datos.

Comments are closed.