2016-02-23 4 views
1

Я ManyToOne отношения в доктрине (Многие результаты в одном PollingStation):Доктрина запрос для поиска объектов на основе поля связанных сущностей

/** 
* @ORM\ManyToOne(targetEntity="Iballot\CmsBundle\Entity\PollingStation2", inversedBy="results", cascade={"persist"}) 
* @ORM\JoinColumn(nullable=false) 
* @Expose 
*/ 
private $pollingStation2; 

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

public function getForSearch($keyWord) 
{ 
    $query = $this->_em->createQueryBuilder(); 
    $query 
     ->select('r') 
     ->from('IballotCmsBundle:Result', 'r') 
     ->where($query->expr()->like('p.pollingStation2', $query->expr()->literal('%' . $keyWord . '%'))) 
     //->orderBy('p.', 'ASC') 
     ->getQuery() 
     ->setParameter('keyWord', '%'.$keyWord.'%'); 
    return $query->getQuery()->getResult(); 
} 

Я получаю следующее сообщение об ошибке

[Semantical Error] line 0, col 48 near 'pollingStation2': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

+0

-> leftJoin (r.pollingStations2, 'p') Ваш заказ также имеет проблему. Подготовка к супер-вторнику? – Cerad

ответ

0

По словам @Cerad (еще один раз), вам нужен JOIN, чтобы сделать связанный объект доступным при построении запроса.

Попробуйте это:

$query = $this->_em->createQueryBuilder(); 
$query 
    ->select('r') 
    ->from('IballotCmsBundle:Result', 'r') 
    ->leftJoin('r.pollingStation2', 'p') // The missing join 
    ->where('p.name LIKE :keyword') // where p.name like %keyword% 
    ->setParameter('keyword', '%'.$keyword.'%') 
    ->orderBy('p.name', 'ASC') // order by p.name ASC 
    ->getQuery() 

return $query->getResult(); 

КСТАТИ Я установил Ваш orderBy, упрощена ваш where и фиксированный параметр keyword, который ошибочно определен.

0

Попробуйте поставить этот метод в Результата EntityRepository класс:

public function getForSearch($keyWord) 
{ 
    $query = $this->createQueryBuilder('r'); 
    $query 
     ->join('r.pollingStation2', 'p') 
     ->where('p.name LIKE :keyword') 
     ->setParameter('keyword', '%' . $keyWord . '%') 
     //->orderBy('p.', 'ASC') 
    ; 
    return $query->getQuery()->getResult(); 
}