获取嵌入式文件mongodb Symfony2

时间:2015-12-06 22:27:32

标签: php mongodb symfony

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

/**
 * @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. 

最后一个错误是正常的,因为我试图显示一个数组,我猜...

如何查询这些地址字段?

1 个答案:

答案 0 :(得分:0)

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

<强> TL; DR

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

为什么?

{{ i.address }}的类型为Doctrine\ODM\MongoDB\PersistentCollection。集合是一个包含多个其他对象的对象(在您的情况下为address类型)。此集合类实现了构建到PHP中的ArrayAccess接口。

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

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

<强>循环

您也可以loop覆盖您的地址:

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

<小时/> 顺便说一句,请用大写字母开始你的课程名称。在PHP和许多其他语言中,大写类名称被认为是一种很好的做法。