2016-05-17 63 views
3

我想要創建一個查詢更精確的搜索條件的查詢,例如,搜索「埃森」應返回Essen目前它返回Evessen,因爲這也是一個有效的值。將MySQL SELECT/LIKE優先級存儲在存儲庫中

我目前的功能:

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'

任何其他方式(不返回數組,因爲如果輸出是一個數組,需要大量修改的函數,我想避免這種情況)也許?

+0

DQL僅支持SQL的數量有限函數:http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#dql-functions。 instr不是其中之一。你將不得不添加你自己的用戶定義函數或使用其中的一個dql包。 http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html或者,正如@DenisAlimox所建議的那樣,使用本機查詢。 – Cerad

回答

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(); 
+0

這個工作幾乎完美,但'$ rsm-> addFieldResult('c','price','price');'是一個外鍵,我需要這些值,不幸的是它是'null'。我怎樣才能得到這些? – PrimuS

+0

@PrimuS請參閱文檔請使用Doctrine \ ORM \ Query \ ResultSetMappingBuilder <?php ; $ 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'); ('id'=>'address_id'));''我的項目\地址','a','u','地址' –