使用Symfony实体进行自我JOIN查询

时间:2016-02-26 14:31:07

标签: symfony join doctrine-orm self-join

这是我的表:

enter image description here

我的类别实体(没有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个实体。我已经使用查询构建器尝试了很多东西,现在我已经完全丢失了。

1 个答案:

答案 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');