在存储库中优先考虑MySQL SELECT / LIKE结果

时间:2016-05-17 11:44:11

标签: php mysql symfony doctrine

我想创建一个用于评估更精确搜索字词的查询,例如搜索" Essen"应返回Essen目前返回Evessen,因为这也是有效值。

我目前的职能:

public function findCities($city){

    $qb = $this->createQueryBuilder('z');

    $qb
        ->select('z')
        ->where($qb->expr()->like('z.city', ':city'))
        ->orderBy('z.code')
        ->setParameter('city', '%'.$city . '%');

    return $qb->getQuery()->getResult();
}

根据THIS建议我创建了一个存储库函数:

public function findCities($city){

    $qb = $this->createQueryBuilder('z');

    $qb
        ->select('z')
        ->where($qb->expr()->like('z.city', ':city'))
        ->orderBy('INSTR(z.city, '.$city.'), z.city')
        ->setParameter('city', '%'.$city . '%');

    return $qb->getQuery()->getResult();
}

不幸的是,它会返回[Syntax Error] line 0, col 70: Error: Expected known function, got 'INSTR'

任何其他方法(不返回数组,因为如果输出是一个数组,有一个需要大量改变的函数,我想避免这种情况)可能吗?

1 个答案:

答案 0 :(得分:1)

DQL中没有INSTR功能,这就是您收到此错误的原因see docs

相反,你可以制作NativeQuery see docs

类似这样的事情

$rsm = new \Doctrine\ORM\Query\ResultSetMapping();

$rsm->addEntityResult('City', 'c');

// for every selected field you should do this
$rsm->addFieldResult('c', 'id', 'id');
$rsm->addFieldResult('c', 'name', 'name');

$em = $this->getEntityManager()
    ->createNativeQuery('
        SELECT
          id, name
        FROM cities WHERE city LIKE '%:city%'
ORDER BY INSTR(city, ':city'), city',
        $rsm
    )->setParameter('city', $city);

return $em->getResult();