Symfony2 дублируется ManyToOne

У меня есть 2 сущности. Я хотел бы получить результат, как показано ниже. Я попробовал это на своем сервере:

«ВЫБЕРИТЕ s.se_name, c.ca_name ИЗ категории внутреннего соединения службы c ON s.ca_id_id = c.id»

Это работает нормально. Но теперь я хотел бы преобразовать его в запрос Symfony. Без WHERE я получил всю комбинацию. Как я могу использовать WHERE в этой ситуации?

+----+---------+         +----+---------+-------+
+ id + ca_name +         + id + se_name + ca_id +
+----+---------+         +----+---------+-------+        
+ 1  + A       +    +    + 1  + a1      + 1     +  =>  a1 .. A
+----+---------+         +----+---------+-------+      a2 .. A
+ 2  + B       +         + 2  + a2      + 1     +
+----+---------+         +----+---------+-------+

Сервисный объект:

/**
* Service
*
* @ORM\Table(name="service")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ServiceRepository")
*/
class Service {
 ...

 /**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="services", cascade={"persist","remove"})
 * @ORM\JoinColumn(onDelete="CASCADE")
 */
 private $caId;

 /**
 * Set caId
 *
 * @param \AppBundle\Entity\Category $caId
 *
 * @return Service
 */
 public function setCaId(\AppBundle\Entity\Category $caId = null)
 {
     $this->caId = $caId;
     return $this;
 }

 /**
 * Get caId
 *
 * @return \AppBundle\Entity\Category
 */
 public function getCaId()
 {
     return $this->caId;
 }
}

Сущность категории:

/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
*/
class Category {
 ...

 /**
 * @ORM\OneToMany(
 *   targetEntity="Service",
 *   mappedBy="caId"
 * )
 */
 private $services;

 /**
 * Constructor
 */
 public function __construct()
 {
   $this->services = new ArrayCollection();
 }

 /**
 * Get orders
 *
 * @return Collection
 */
 public function getServices()
 {
   return $this->services;
 }
}

Сервисный репозиторий

   /**
   * @return \Doctrine\Common\Collections\ArrayCollection
   */
  public function getAllServices()
  {
    $qb = $this
        ->createQueryBuilder('s')
        ->select('c.caName, s.id, s.seName, s.sePrice')
        ->from('AppBundle:Category', 'c');
    return $qb->getQuery()->getResult();
  }

person Trung Vu    schedule 02.01.2016    source источник


Ответы (1)


Вы также можете использовать объединения в языке запросов Doctrine. В вашем репозитории вы можете сделать что-то вроде этого:

public function getAllServices()
{
    $query = $this->getEntityManager()->createQuery(
        'SELECT service
        FROM AppBundleService AS service
        INNER JOIN service.caId'
    );

    return $query->getResult();
}

Вы можете добиться того же, используя гибкий интерфейс построителя запросов. Но это не добавляет никакой ценности, когда сам запрос не создается во время выполнения на основе пользовательского ввода.

person xabbuh    schedule 02.01.2016
comment
Привет, xabbuh, приятно снова тебя видеть. Ваш запрос не сработал. Он возвращает мне сервис с пустой категорией. Я попробовал SELECT s.seName, c.caName FROM AppBundle:Service s INNER JOIN AppBundle:Category c WHERE s.caId = c.id, и теперь он работает нормально. - person Trung Vu; 02.01.2016
comment
Я не понимаю, почему это должно произойти с этим запросом. Внутреннее соединение гарантирует, что для службы должна быть категория. Кстати, вы видите, что условие выглядит странно, когда вы сравниваете сущность Category (s.caId) со скалярным значением (c.id). - person xabbuh; 02.01.2016
comment
У меня получилось примерно так: array:1 [▼ 0 =› Service {#628 ▼ -id: 32 -seName: abc -caId: Category {#650 ▼ +__isInitialized__: false -id: 5 -caName: null -services: ноль … 2 } } ] - person Trung Vu; 02.01.2016
comment
OH :) Я изменил ваш запрос на запрос symfony, и теперь он работает нормально. return $this->createQueryBuilder('s') ->select('s,c') ->join('s.caId', 'c')->getQuery()->getResult(); - person Trung Vu; 02.01.2016
comment
Не могли бы вы проверить мою другую проблему, пожалуйста? :D stackoverflow.com/questions/34565333/ - person Trung Vu; 02.01.2016
comment
Как я могу добиться caNumber на своем контроллере? Теперь я получил: 0 => Service {# 637 ▼ -id: 37 -seName: a1 -caId: Category {# 615 ▼ -id: 2 -caName: A -caNumber: 3 -services: PersistentCollection {# 641 ▶} } } - person Trung Vu; 02.01.2016
comment
Вы можете просто использовать методы, предоставляемые вашими сущностями, например: $results[0]->getCatId()->getCaNumber() - person xabbuh; 02.01.2016