Я делаю веб-сайт, который показывает какой-то проект с меню. В этом меню вы можете выбрать язык для фильтрации проектов. Моя проблема связана с запросом на получение проекта для определенного языка. У меня есть 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, у которого есть идентификатор
И вот мой текущий запрос, который не работает:
$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();
Спасибо за ваш ответ!






Doctrine позволяет вам сделать абстракцию базы данных. Вы не должны думать с таблицей базы данных, а с сущностью: Ваш объект проекта имеет свойство $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) полностью прозрачна!
Нет проблем :) Поэтому, вы должны сделать метод в ProductRepository с этим запросом, чтобы отвязать код от контроллера. Например, вы можете назвать его «findByLanguage($languageId)».