животные:
| id | name |
|----|------|
| 1 | cat |
| 2 | dog |
| 3 | frog |
категория:
| id | name |
|----|--------|
| 1 | green |
| 2 | blue |
| 3 | orange |
animals_category:
| animals_id | category_id |
|------------|-------------|
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
Что я хочу сделать, это получить categories
за dog
:
green, blue
Это мой подход:
контроллер:
$id = '2';
$result = $this->getDoctrine()->getRepository('Animals:Category')->findByIdJoinedToCategory(['id'=>$id]);
Хранилище животных:
public function findByIdJoinedToCategory()
{
$query = $this->getEntityManager()
->createQuery(
'SELECT a, b FROM Animals:Category a
JOIN a.category b');
try {
return $query->getResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
Но я получаю сообщение об ошибке:
Неизвестный объект — псевдоним пространства имен «Животные».
юридическое лицо Animals
:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity(repositoryClass="App\Repository\AnimalsRepository")
*/
class Animals
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\ManyToMany(targetEntity="Category")
* @ORM\JoinColumn(name="category", referencedColumnName="id")
*/
private $category;
public function getId(): ?int
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getCategory()
{
return $this->category;
}
public function setCategory($category): self
{
$this->category = $category;
return $this;
}
public function addCategory(Category $category): self
{
$this->category[] = $category;
return $this;
}
public function __construct()
{
$this->category = new ArrayCollection();
}
}
Нет никаких Animals:Category
юридическое лицо. У вас есть лица Animals
а также Category
,
Правильный ответ зависит от того, используете ли вы Symfony 3 или 4, потому что Symfony 3 использует псевдонимы сущностей (пространство имен с :
обозначения, которые вы пытаетесь не использовать), в то время как Symfony 4 предпочитает полное квалифицированное пространство имен (\App\Entity\Animals
).
Итак, первая ошибка в строке, где вы пытаетесь получить хранилище:
getRepository('Animals:Category')
И второй в findByIdJoinedToCategory()
в DQL-запросе:
'SELECT a, b FROM Animals:Category a
JOIN a.category b'
Теперь решения:
Symfony 3
Поскольку, похоже, у вас нет пакетов (я полагаю, это Symfony 4, но неважно), у вас нет псевдонима пространства имен сущности, поэтому вы должны просто использовать его имя.
getRepository('Animals')
Теперь я предполагаю, что с a
Вы хотите сослаться Animals
сущность / таблица, поэтому она должна быть
'SELECT a, b FROM Animals a
JOIN a.category b'
Symfony 4
Если вы используете Symfony 4, тогда используйте FQNS для сущности в качестве имени сущности (App\Entity\Animals
).
Так было бы
getRepository('\App\Entity\Animals')
или же
getRepository(\App\Entity\Animals::class)
чтобы получить хранилище. Второй вариант лучше, потому что при необходимости легче будет проводить рефакторинг (IDE сможет найти использование класса).
И в запросе это будет
'SELECT a, b FROM App\Entity\Animals a
JOIN a.category b'
или если вы хотите избежать использования жестко закодированных имен строковых классов:
'SELECT a, b FROM ' . \App\Entity\Animals:class . ' a
JOIN a.category b'
Других решений пока нет …