使用 Symfony 实体进行自连接查询

Self JOIN query with Symfony entity

这是我的 table :

我的类别实体(没有 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 个实体。我用查询生成器尝试了很多东西,现在我完全迷路了。

首先,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');