也许有人可以帮我解决这个问题。我有以下文件:
/**
* @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和许多其他语言中,将类名大写被认为是一种很好的做法。