【问题标题】:Prioritize MySQL SELECT/LIKE result in Repository在存储库中优先考虑 MySQL SELECT/LIKE 结果
【发布时间】:2016-05-17 11:44:11
【问题描述】:

我想创建一个查询更精确的搜索词,例如搜索“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'

任何其他方法(不返回数组,因为如果输出是数组,则需要大量更改的函数,我想避免这种情况)也许?

【问题讨论】:

标签: php mysql symfony doctrine


【解决方案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();

【讨论】:

  • 这工作几乎完美,但$rsm->addFieldResult('c', 'price', 'price'); 是一个外键,我需要其中的值,不幸的是它是null。我如何获得这些?
  • @PrimuS 请参阅文档<?php use Doctrine\ORM\Query\ResultSetMappingBuilder; $sql = "SELECT u.id, u.name, a.id AS address_id, a.street, a.city " . "FROM users u INNER JOIN address a ON u.address_id = a.id"; $rsm = new ResultSetMappingBuilder($entityManager); $rsm->addRootEntityFromClassMetadata('MyProject\User', 'u'); $rsm->addJoinedEntityFromClassMetadata('MyProject\Address', 'a', 'u', 'address', array('id' => 'address_id'));
猜你喜欢
  • 1970-01-01
  • 2018-11-25
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多