Как я могу получить данные из ArrayCollection (Symfony)? - PullRequest
0 голосов
/ 07 января 2019

животные:

| 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();
  }
}

1 Ответ

0 голосов
/ 07 января 2019

Нет 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'
...