根据Doctrine 2 docs here,您可以使用具有自引用一对多关系的类来创建实体层次结构。我希望能够查询所有相关子类的所有类别。
此时,当我从控制器转储时,查询返回'未初始化':#collection:ArrayCollection -elements:[]。
我不知道如何调整QueryBuilder来为孩子们提供水分。
CategoryRepository中的代码:
public function retrieveHydratedCategories()
{
return $this->createQueryBuilder('c')
->select('c, p, b')
->leftJoin('c.products', 'p')
->leftJoin('p.brand', 'b')
->Where("c.isActive = 1")
->getQuery()
->execute();
}
我的类别实体:
<?php
// src/Entity/Category.php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
/**
* @ORM\Entity(repositoryClass="App\Repository\CategoryRepository")
* @ORM\Table(name="categories")
*/
class Category
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=25)
*/
private $name;
/**
* @ORM\Column(type="string", length=64)
*/
private $brand;
/**
* @ORM\Column(type="string", length=100)
*/
private $image;
/**
* One ProductCategory has Many ProductCategories.
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
*/
private $children;
/**
* Many ProductCategories have One ProductCategory.
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
*/
private $parent;
/**
* @ORM\Column(name="is_active", type="boolean")
*/
private $isActive;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Product", mappedBy="category")
*/
private $products;
public function __construct()
{
$this->products = new ArrayCollection();
$this->children = new ArrayCollection();
}
/**
* @return Collection|Product[]
*/
public function getProducts()
{
return $this->products;
}
public function getChildren()
{
return $this->children;
}
public function getParent()
{
return $this->parent;
}
public function getName()
{
return $this->name;
}
public function getId()
{
return $this->id;
}
public function getImage()
{
return $this->image;
}
public function setName($name)
{
$this->name = $name;
}
public function addChildren (Category $children)
{
$this->children[] = $children;
return $this;
}
public function setIsActive($isActive)
{
$this->isActive = $isActive;
}
public function getBrand()
{
return $this->brand;
}
}
答案 0 :(得分:0)
自我引用一对多关联与收集水合作用的常规一对多关联没有什么不同。如果您希望检索类别的直接子项,则必须在当前查询中添加另一个联接。类似的东西:
products
话虽如此,只有你有一个深度才有效。如果您希望检索子项的子项,则必须添加另一个联接(Codename One SMS Library),或者从讨论see this post的平面结果集中生成类别树。
对于孩子们的statvfs()
关联,情况也是如此。除非您在查询中添加针对子项的产品的特定连接,否则相应的集合将不会被水合(如果子项也是在主结果集中检索的父项,则可能是水合的。)。