如何从ArrayCollection(Symfony)中检索数据?

时间:2019-01-07 09:24:02

标签: php symfony doctrine entity arraycollection

动物:

| 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 :(得分:3)

没有Animals:Category实体。您有实体AnimalsCategory

正确的答案取决于您使用的是Symfony 3还是4,因为Symfony 3使用实体别名(您尝试使用:表示法命名空间),而Symfony 4则首选完全限定的名称空间({ {1}}。

因此,第一个错误是您试图获取存储库的地方:

\App\Entity\Animals

DQL查询中getRepository('Animals:Category') 中的第二个:

findByIdJoinedToCategory()

现在的解决方案:

Symfony 3

由于看起来您没有任何捆绑软件(我想它是Symfony 4,但无论如何),因此您没有任何实体名称空间别名,因此您应该简单地使用其名称。

'SELECT a, b FROM Animals:Category a
JOIN a.category b'

现在,我假设,对于getRepository('Animals') ,您想引用a实体/表,因此它应该是

Animals

Symfony 4

如果您使用Symfony 4,则使用应该使用实体FQNS作为实体名称('SELECT a, b FROM Animals a JOIN a.category b' )。

应该是

App\Entity\Animals

getRepository('\App\Entity\Animals')

获取存储库。第二个更好,因为在需要时可以更轻松地进行重构(IDE可以找到类的用法)。

在查询中为

getRepository(\App\Entity\Animals::class)

或者如果您想避免使用硬编码的字符串类名称:

'SELECT a, b FROM App\Entity\Animals a
JOIN a.category b'