2016-02-26 4 views
2

Вот мой стол:автообъединения запрос с Symfony лицом

enter image description here

Моей Категорией объект (без геттера/сеттера):

/** 
* @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 запроса, один для самой категории и один для r oot категории. Я хотел бы создать свою собственную функцию репозитория для объединения двух объектов в один запрос. Я пробовал так много вещей с построителем запросов, теперь я полностью потерян.

ответ

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'); 
+0

Спасибо большое, мне нужно pratice иметь дело с QueryBuilder. – Gaius

+0

Спасибо за ваш очень хороший вопрос. До вашего принятия я не был уверен в том, работает ли он на ассоциации с самообслуживанием. Сейчас я :) – chalasr