Symfony QueryBuilder - PullRequest
       19

Symfony QueryBuilder

0 голосов
/ 14 марта 2019

Я делаю сайт, который показывает какой-то проект с меню. В этом меню вы можете выбрать язык для фильтрации проектов. Моя проблема с запросом, чтобы получить проект для определенного языка. У меня есть 2 лица, проект и язык:

Проект:

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProjectRepository")
 */
class Project
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Language",     inversedBy="projects")
     */
    private $languages;

    public function __construct()
    {
        $this->languages = new ArrayCollection();
    }


    /**
     * @return Collection|Language[]
     */
    public function getLanguages(): Collection
    {
        return $this->languages;
    }

    public function addLanguage(Language $language): self
    {
        if (!$this->languages->contains($language)) {
            $this->languages[] = $language;
        }

        return $this;
    }

    public function removeLanguage(Language $language): self
    {
        if ($this->languages->contains($language)) {
            $this->languages->removeElement($language);
        }

        return $this;
    }
}

Язык:

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\LanguageRepository")
 */
class Language
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Project", mappedBy="languages")
     */
    private $projects;


    public function __construct()
    {
        $this->projects = new ArrayCollection();
    }

    /**
     * @return Collection|Project[]
     */
    public function getProjects(): Collection
    {
        return $this->projects;
    }

    public function addProject(Project $project): self
    {
        if (!$this->projects->contains($project)) {
            $this->projects[] = $project;
            $project->addLanguage($this);
        }

        return $this;
    }

    public function removeProject(Project $project): self
    {
        if ($this->projects->contains($project)) {
            $this->projects->removeElement($project);
            $projet->removeLangage($this);
        }

        return $this;
    }
}

В моей базе данных они связаны project_language, которые имеют там id

А вот мой текущий запрос, который не работает:

$init = 'language_C_1';
$array = explode('_', $init);

$repo = $this->getDoctrine()->getRepository(Project::class);

$init = $array[2];
$query = $repo->createQueryBuilder('p')
    ->innerJoin('project_language', 'pl', Join::WITH, 'p.id = pl.project_id')
    ->innerJoin('language', 'l', Join::WITH, 'pl.language_id = l.id')
    ->where('l.id = :init')
    ->setParameter('init', $init)
    ->getQuery();

$arrayProjets = $query->getResult();

Спасибо за ваш ответ!

1 Ответ

0 голосов
/ 14 марта 2019

Doctrine позволяет делать абстракцию базы данных. Вы должны думать не с таблицей базы данных, а с сущностью: У вашего Project Entity есть свойство $ languages, поэтому вы можете использовать его в вашем queryBuilder следующим образом:

$repo
->createQueryBuilder('p')
// add this to also load the languages entities
->addSelect('l')
->innerJoin('p.languages', 'l')
->where('l.id = :languageId')
->setParameter('languageId', $languageId)
->getQuery();

Я сделал объединение для свойства $ languages ​​сущности Product: Таблица соединений (здесь project_language) полностью прозрачна!

...