如何从ArrayCollection(Symfony)检索数据



动物:

| 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           |

我想做的是为dog:获取categories

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 (DoctrineORMNoResultException $e) {
return null;
}
}

但我收到一条错误消息:

未知实体命名空间别名"Animals"。

实体Animals:

<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;
/**
* @ORMEntity(repositoryClass="AppRepositoryAnimalsRepository")
*/
class Animals
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;

/**
* @ORMColumn(type="string", length=255)
*/
private $name;

/**
* @ORMManyToMany(targetEntity="Category")
* @ORMJoinColumn(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实体。您有实体AnimalsCategory

正确的答案取决于您使用的是Symfony 3还是4,因为Symfony 3使用实体别名(使用您尝试使用的:表示法命名),而Symfony 4更喜欢完全限定的命名空间(AppEntityAnimals)。

所以,第一个错误出现在您试图获取存储库的位置:

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作为实体名称(AppEntityAnimals)。

所以它将是

getRepository('AppEntityAnimals')

getRepository(AppEntityAnimals::class)

以获取存储库。第二个更好,因为它在需要时更容易重构(IDE将能够找到类的用法)。

在查询中,它将是

'SELECT a, b FROM AppEntityAnimals a
JOIN a.category b'

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

'SELECT a, b FROM ' . AppEntityAnimals:class . ' a
JOIN a.category b'

相关内容

  • 没有找到相关文章

最新更新