也许有人可以帮我解决这个问题。 我有以下文件:
/**
* @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.
最后一个错误是正常的,因为我试图显示一个数组,我猜...
如何查询这些地址字段?
答案 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和许多其他语言中,大写类名称被认为是一种很好的做法。