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

Php 在存储库中对MySQL SELECT/LIKE结果进行优先级排序,php,mysql,symfony,doctrine,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')

我想创建一个查询,对更精确的搜索词进行赋值,例如,搜索“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();
}
根据建议,我创建了一个存储库函数:

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]第0行,第70列:错误:预期已知函数,得到'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();

DQL只支持有限数量的sql函数:。instr不是其中之一。您必须添加自己的用户定义函数或使用其中一个dql捆绑包。或者,正如@DenisAlimox所建议的,使用本机查询。这几乎是完美的,但是
$rsm->addFieldResult('c','price','price')
是一个外键,我需要从中获取值,不幸的是它是
null
。我怎样才能得到这些呢?@PrimuS请查看文档