2016-05-17 7 views
3

より正確な検索語句を検索するクエリを作成したいとします。 "Essen"の検索はEssenを返すべきですが、これは有効な値でもあるのでEvessenを返します。MySQL SELECT/LIKEをリポジトリに優先順位付けする

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'

その他のアプローチを(返す:

私の現在の機能:私はリポジトリ機能を作成しTHISアドバイスに基づいて

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

出力が配列の場合は重い変更を必要とする関数があるので、私はそれを避けたいでしょう)?あなたが作ることができる代わりにsee docs

このエラーを取得する理由をDQLにはINSTR関数はありません

+0

DQLのようなsee docs

何かは、SQLの限られた数をサポートしています関数:http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#dql-functions。 instrはその1つではありません。独自のユーザ定義関数を追加するか、そこにdqlバンドルを使用する必要があります。 http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html @DenisAlimoxが示唆しているように、ネイティブクエリを使用します。 – Cerad

答えて

1

が、それはだ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(); 
+0

これはほぼ完璧ですが、 '$ rsm-> addFieldResult( 'c'、 'price'、 'price');は値が必要な外部キーです。残念ながら' null'です。どうすればそれらも入手できますか? – PrimuS

+0

@PrimuSドキュメントを参照してください。 '<?php Doctrine \ ORM \ Query \ ResultSetMappingBuilderを使用してください。 $ sql = "SELECT u.id、u.name、a.id AS address_id、a.street、a.city"。 "ユーザーからのIN INNER JOINのアドレスは、u.address_id = a.id"となります。 $ rsm = new ResultSetMappingBuilder($ entityManager); $ rsm-> addRootEntityFromClassMetadata( 'MyProject \ User'、 'u'); ( 'MyProject \ Address'、 'a'、 'u'、 'address'、配列( 'id' => 'address_id')); ' –

関連する問題