2015-10-05 70 views
0

我使用这个bundle和我wanto通过%LIKE% MySQL来找到我的元素使用像%2

我的文件是这样的:

{ 
    "_id": "60a403542a2b7d44bf84ed569d1e6efe", 
    "_rev": "1-9e1ed380dd91ac8c835ef0f8e152f0a8", 
    "type": "mytype", 
    "doctrine_metadata": { 
     "indexes": [ 
      "name", 
     ] 
    }, 
    "name": "barfoo", 

} 

我想找到的所有元素那开始barfo

我看到这个link,但我不知道这是否是一个正确的解决方案。 如何在couchDb + symfony2中查询Like

回答

1

couchDb(1.6.1)中没有%Like%,但可以使用startkey和endkey。

你必须创建一个类似的看法:

function (doc) { 
    if (doc.type = 'myType') { 
     emit(doc.name, doc.name); 
    } 
} 

与名字例如people

例如和简单

Designname = people 
viewname = people 

之后,你可以做到这一点卷曲

curl -X GET 'http://localhost:5984/db/_design/people/_view/people?startkey="foo"&endkey="foo\ufff0"' 

通过这种方式,你可以找到以foo开头的所有元素。

为什么\ ufff0?勾选此link

字符串范围

如果你需要开始和结束这包括每串有 给定前缀键,最好是使用高价值的Unicode字符,比 使用“ZZZZ '后缀。

也就是说,而非:

startkey = “ABC” & endkey = “abcZZZZZZZZZ” 你应该使用:

startkey = “ABC” & endkey = “ABC \ ufff0”

如何在Symfony中做到这一点?

如果你想创建由Symfony的查看 可以在yourapp/AppBundle/CouchDocument/View/PeopleView.php

<?php 

namespace yourapp\AppBundle\CouchDocument\View; 

use Doctrine\CouchDB\View\DesignDocument; 

class PeopleView implements DesignDocument 
{ 

    public function getData() 
    { 
     $people = <<<'JS' 
function (doc) { 
     if (doc.type = 'myType') { 
      emit(doc.name, doc.name); 
     } 
    } 
JS; 

     return array(
      'views' => array(
       'people' => array(
        'map' => $people, 
       ), 
      ) 
     ); 

    } 
} 

,并在控制器中创建视图,你可以做这样的事情

/** 
* @Route("/testPeople/{code}", name="test_people") 
* @Method({"GET"}) 
* @Template("myAppBundle:People:test_query.html.twig") 
*/ 
public function testPeopleAction($code) 
{ 

    $dm = $this->container->get(
     'doctrine_couchdb.odm.default_document_manager' 
    ); 
    $peopleView = new PeopleView(); 
    $client = $this->container->get('doctrine_couchdb.odm.default_document_manager'); 
    $view = $client->createDesignDocument('people', $peopleView); 

    $relatedObjects = $dm->createNativeQuery('people', 'people') 
     ->setStartKey($code) 
     ->setEndKey($code . "\xEF\xBF\xB0") 
     ->execute(); 
    $a = array(); 
    foreach ($relatedObjects as $doc) { 
     $a[] = $doc['value'] //it is your results 
    } 

    return array(
     'results' => $a 
    ); 
} 

我看到了单元测试里面vendor/doctrine/couchdb/tests/Doctrine/Tests/CouchDB/CouchDBClientTest.php找到有用的东西

我不知道这是最好的方式,但对我来说它的工作原理: )