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?
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í:
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:
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.