获取一个嵌入文档mongodb Symfony2


Fetch an embedded document mongodb Symfony2

也许有人可以帮我解决这个问题。我有以下文件:

/**
 * @MongoDB'Document
 */
class guest {
    /**
     * @MongoDB'Id(strategy="NONE")
     * @var string
     */
    protected $guest_id;

    /**
     * @MongoDB'String
     */ 
    protected $last_name;

    /**
     * @MongoDB'String
     */
    protected $first_name;

    /**
     * @MongoDB'String
     */
    protected $gender;

    /**
     * @MongoDB'EmbedMany(targetDocument="address")
     */    
    protected $address;

地址文件在这里:

/**
 * @MongoDB'EmbeddedDocument
 */
class address {
    /**
     * @MongoDB'String
     */
    protected $street;

    /**
     * @MongoDB'String
     */
    protected $city;

    /**
     * @MongoDB'String
     */
    protected $zip_code;

    /**
     * @MongoDB'String
     */
    protected $country;

这是一份文件:

    "_id" : "JM15061985",
    "last_name" : "Michel",
    "first_name" : "Justine",
    "gender" : "Female",
    "title" : "Mme",
    "telephone" : 3375,
    "mail" : "justine.michel@yahoo.com",
    "language" : "French",
    "birthday" : ISODate("1985-06-14T22:00:00Z"),
    "status" : "VIP",
    "company" : "Test",
    "address" : [
        {
            "street" : "45 Avenue de Paris",
            "city" : "Nice",
            "zip_code" : "06072",
            "country" : "France"
        },
]

现在我想在Twig中显示这些信息,所以我使用querybuilder创建了以下内容:

   public function guestAction()
   {     
       $guest = $this->get('doctrine_mongodb')
                     ->getManager()
                     ->createQueryBuilder('KpqBundle:guest')
                     ->field('address.city')->equals('Nice')
                     ->getQuery()
                     ->execute();
       return $this->render('KpqBundle:Default:index.html.twig', array('guest' => $guest));
    }

然后在Twig视图中,我创建了这个循环来显示信息:

{% for i in guest %}
  {{ i.firstname }}
  {{ i.lastname }}
{% endfor %}

但是如何获取地址字段?我尝试了类似{{ i.city }}的东西,但它给了我以下错误:

Method "city" for object "Kpq'KpqBundle'Document'guest" does not exist in PmsBundle:Default:index.html.twig at line 59 

如果我尝试这个:{{ i.address }},我会得到以下错误:

An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class Doctrine'ODM'MongoDB'PersistentCollection could not be converted to string") in KpqBundle:Default:index.html.twig at line 59. 

最后一个错误是正常的,因为我正在尝试显示一个数组,我想。。。

如何查询这些地址字段?

看起来您的查询还可以。正如错误消息所述,问题是您试图显示一个无法转换为字符串的对象。

TL;DR

使用{{ i.address[0].city }}

为什么

{{ i.address }}的类型为Doctrine''ODM''MongoDB ''PersistentCollection。集合是一个包含其他几个对象(在您的案例中为address类型)的对象。这个集合类实现了ArrayAccess接口,该接口构建在PHP中。

您可以像任何普通的PHP数组一样使用实现该接口的对象,这意味着您可以使用object[0]object[1]来获取集合中的第一个和第二个项。在Twig中有几种访问数组的方法。其中之一是使用foo['bar']表示法,就像您在PHP中习惯的那样。因此,可以使用{{ i.address[0].city }}访问第一个地址的城市。

{{ i }}这是您的来宾对象。{{ i.address }}是地址的集合。{{ i.address[0] }}是集合中的第一个条目,类型为地址{{ i.address[0].city }}是一个字符串。

循环

你也可以循环浏览你的地址:

{% for address in i.address %}   
  <address>
    {{ address.street }}<br>
    {{ address.zip_code }}, {{ address.city }}<br>
    {{ address.country }}   
  </address> 
{% endfor %}


顺便说一下,请用大写字母开头。在PHP和许多其他语言中,将类名大写被认为是一种很好的做法。