在存储库中对MySQL SELECT/LIKE结果进行优先级排序


Prioritize MySQL SELECT/LIKE result in Repository

我想创建一个值更精确的搜索词的查询,例如搜索"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();
}

根据这个建议,我创建了一个存储库功能:

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'

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

DQL中没有INSTR函数,这就是为什么您会出现此错误,请参阅文档

相反,您可以让NativeQuery查看文档

像这个

$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();