У меня проблема с Symfony.
У меня есть три таблицы в моей базе данных:
Musicien, композитор и творчество
Composer - это таблица ассоциаций между Musicien и Oeuvre.
Когда я загружаю страницу, которая показывает Musicien, она показывает его Oeuvres.
Поэтому я делаю соединение между Musicien и Composer, а также между Composer и Oeuvre.
Из Musicien я могу получить все его композитора с одним запросом. Но, чтобы показать его произведения, мне нужно зациклить его композиторов, чтобы получить все произведения.
Это делает один запрос get, поэтому, если у меня есть n Composer, он делает n запрос.
Это ужасно медленно.
Я хочу сделать это с помощью одного запроса, но я не знаю, как это сделать, вы можете мне помочь?
Может быть, если я сделаю соединение между Musicien и Oeuvre напрямую, но я тоже не знаю, как это сделать.
Спасибо.
Это мой код:
Musicien:
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Musicien
*
* @ORM\Table(name="Musicien", indexes={@ORM\Index(name="IDX_AC6BE67520B77BF2", columns={"Code_Pays"}), @ORM\Index(name="IDX_AC6BE675E1990660", columns={"Code_Genre"}), @ORM\Index(name="IDX_AC6BE675D389A975", columns={"Code_Instrument"})})
* @ORM\Entity
*/
class Musicien
{
/* Some attributes here*/
/**
* @var \Composer
*
* @ORM\OneToMany(targetEntity="Composer", mappedBy="codeMusicien")
*/
private $composer;
public function __construct(){
$this->oeuvres = new ArrayCollection();
}
public function getOeuvres()
{
$oeuvres = new ArrayCollection();
$oeuvres->add($this->composer->getCodeOeuvre());
// foreach($this->composer as $c){
// $oeuvres->add($c->getCodeOeuvre());
// }
return $oeuvres;
}
}
Композитор
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Composer
*
* @ORM\Table(name="Composer", indexes={@ORM\Index(name="IDX_6105648EE694D5AB", columns={"Code_Musicien"}), @ORM\Index(name="IDX_6105648ECB48FCBD", columns={"Code_Oeuvre"})})
* @ORM\Entity
*/
class Composer
{
/**
* @var int
*
* @ORM\Column(name="Code_Composer", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $codeComposer;
/**
* @var \Musicien
*
* @ORM\ManyToOne(targetEntity="Musicien", inversedBy="composer")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="Code_Musicien", referencedColumnName="Code_Musicien")
* })
*/
private $codeMusicien;
/**
* @var \Oeuvre
*
* @ORM\ManyToOne(targetEntity="Oeuvre", inversedBy="composer")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="Code_Oeuvre", referencedColumnName="Code_Oeuvre")
* })
*/
private $codeOeuvre;
public function getCodeComposer(): ?int
{
return $this->codeComposer;
}
public function getCodeMusicien(): ?Musicien
{
return $this->codeMusicien;
}
public function setCodeMusicien(?Musicien $codeMusicien): self
{
$this->codeMusicien = $codeMusicien;
return $this;
}
public function getCodeOeuvre(): ?Oeuvre
{
return $this->codeOeuvre;
}
public function setCodeOeuvre(?Oeuvre $codeOeuvre): self
{
$this->codeOeuvre = $codeOeuvre;
return $this;
}
}
Oeuvre
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Oeuvre
*
* @ORM\Table(name="Oeuvre", indexes={@ORM\Index(name="IDX_32522BC898F61075", columns={"Code_Type"})})
* @ORM\Entity
*/
class Oeuvre
{
/**
* Some attributes here
*/
/**
* @var \Composer
*
* @ORM\OneToMany(targetEntity="Composer", mappedBy="codeOeuvre")
* @ORM\JoinTable(name="Composer")
*/
private $composer;
public function __construct(){
$this->musiciens = new ArrayCollection();
}
public function getMusiciens()
{
$musiciens = new ArrayCollection();
foreach($this->composer as $c){
$musiciens->add($c->getCodeMusicien());
}
return $musiciens;
}
}