2016-04-23 81 views
0

我正在嘗試使用createQueryBuilder來進行有效的查詢。 我想所有的組織者,有partOfSearchText,並有一些city_idSymony QueryBuilder

$qb = $em->createQueryBuilder(); 
     $repository = $this->getDoctrine()->getRepository('AppBundle:Organizers'); 
     $query = $repository->createQueryBuilder('o') 
      ->where('o.name LIKE :partOfSearchText') 
      ->andWhere('o.cities = :city_id') 
      ->setParameter('partOfSearchText', '%'.$partOfSearchText.'%') 
      ->setParameter('city_id', $cityId) 
      ->getQuery(); 

但我的查詢是錯誤的,因爲在管理表中沒有o.cities。表只包含ID和名稱。 enter image description here

兩個entiries城市和組織者在DB 3個表: 組織者 市 organizers_cities

其實我只需要在createQueryBuilder這樣的補充:

SELECT Organizer . * 
FROM Organizer 
LEFT JOIN organizers_cities ON Organizer.id = organizers_cities.organizer_id 
WHERE organizers_cities.city_id =25 

我能解決它使用:

$cityId = $em->getRepository('AppBundle:City')->findOneBy(array('link' => $citySlug))->getId(); 
     $city = $em->getRepository('AppBundle:City')->findOneBy(array(
      'link' => $citySlug, 
     )); 
     $organizers = $city->getOrganizers(); 
     foreach ($organizers as $organizer){ 
      $pos = strpos($organizer, $partOfSearchText); 
      if ($pos === false) { 
       //do some things 
      } 
     } 

,但它很醜像地獄

那麼, 如何實現有效的查詢?

City.php

class City 
    { 
     /** 
     * @ORM\Column(type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 
     /** 
     * @ORM\Column(type="string", length=140) 
     */ 
     protected $name; 

     /** 
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Organizer", mappedBy="cities") 
     */ 
     protected $organizers; 
     } 

Organizer.php

class Organizer 
    { 
     /** 
     * @Groups({"jsonForCity", "questOrganizers"}) 
     * @ORM\Column(type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 
     /** 
     * @ORM\Column(type="string", length=140) 
     */ 
     protected $name; 


     /** 
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\City", inversedBy="organizers") 
     * @ORM\JoinTable(name="organizers_cities") 
     * 
     */ 
     protected $cities; 

     public function __construct() { 
      $this->quests = new ArrayCollection(); 
     } 

回答

1
$qb = $em->createQueryBuilder(); 
$repository = $this->getDoctrine()->getRepository('AppBundle:Organizers'); 
$query = $repository->createQueryBuilder('o') 
     ->innerJoin('o.cities', 'c') 
     ->where('o.name LIKE :partOfSearchText') 
     ->andWhere('c.id = :city_id') 
     ->setParameter('partOfSearchText', '%'.$partOfSearchText.'%') 
     ->setParameter('city_id', $cityId) 
     ->getQuery(); 

更多信息:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/query-builder.htmlhttp://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

+0

謝謝!一會兒:用 - >和Where('IDENTITY(c)=:city_id')我得到了錯誤http://imgur.com/YIz1ity。使用 - >和Where('c.id =:city_id')修復。 –

+0

謝謝,我更新了答案 – Miro