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和名稱。
兩個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();
}
謝謝!一會兒:用 - >和Where('IDENTITY(c)=:city_id')我得到了錯誤http://imgur.com/YIz1ity。使用 - >和Where('c.id =:city_id')修復。 –
謝謝,我更新了答案 – Miro