这是我的表:
我的类别实体(没有getter / setter):
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="slug", type="string", length=255, nullable=true)
*/
private $slug;
/**
* @var int
* @Gedmo\TreeLeft
* @ORM\Column(name="lft", type="integer")
*/
private $lft;
/**
* @var int
* @Gedmo\TreeLevel
* @ORM\Column(name="lvl", type="integer")
*/
private $lvl;
/**
* @var int
* @Gedmo\TreeRight
* @ORM\Column(name="rgt", type="integer")
*/
private $rgt;
/**
* @Gedmo\TreeRoot
* @ORM\ManyToOne(targetEntity="Category")
* @ORM\JoinColumn(name="root", referencedColumnName="id", onDelete="CASCADE")
*/
private $root;
/**
* @Gedmo\TreeParent
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
* @ORM\JoinColumn(name="parent", referencedColumnName="id", onDelete="CASCADE")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
* @ORM\OrderBy({"lft" = "ASC"})
*/
private $children;
在我的控制器中,如果我这样做:
$category= $this->container->get('app.category.manager')->getCategoryBySlug($category_slug);
$root = $term->getRoot();
Doctrine执行2个查询,一个用于类别本身,另一个用于类别的根目录。我想创建自己的存储库函数来在一个查询中加入2个实体。我已经使用查询构建器尝试了很多东西,现在我已经完全丢失了。
答案 0 :(得分:1)
首先,create a custom Repository
class为您的实体。
然后,将以下方法粘贴到:
class CategoryRepository extends EntityRepository
{
public function getRootByCategorySlug($slug)
{
return $this->getEntityManager()
->createQueryBuilder()
->from('YourBundle:Category', 'c')
->where('c.slug = :slug')
->setParameter('slug', $slug)
->leftJoin('c.root', 'r') // Join the association
->select('r') // Fetch the association only
->getQuery()
->getResult()
;
}
}
并使用如下:
$repo = $this->getDoctrine()->getManager()->getRepository('YourBundle:Category');
$rootCategory = $repo->getRootByCategorySlug('your_slug');