基于相关实体字段的搜索实体的学说查询

时间:2016-02-23 16:48:21

标签: symfony doctrine-orm doctrine

我在学说中有很多关系(很多结果都是一个投票站):

/**
 * @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();
}

我收到以下错误

  

[语义错误]第0行,第48行'pollingStation2'附近:错误:   无效的PathExpression。必须是StateFieldPathExpression。

2 个答案:

答案 0 :(得分:0)

尝试将此方法放在Result 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();
}

答案 1 :(得分: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();

BTW我修复了您的orderBy,简化了您的where并修复了错误定义的keyword参数。