Как не умножать запрос в Symfony при использовании таблицы ассоциации - PullRequest
0 голосов
/ 08 января 2019

У меня проблема с 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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...