Может быть, кто-то может помочь мне в этом вопросе. У меня есть следующий документ:
/**
* @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" : "[email protected]",
"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. Коллекция - это объект, который содержит несколько других объектов (адрес типа в вашем случае). Этот класс коллекции реализует интерфейс ArrayAccess, который встроен в PHP.
Вы можете использовать объекты, реализующие этот интерфейс, как любой обычный PHP-массив, то есть вы можете использовать object[0]
, object[1]
чтобы получить первый и второй элементы в коллекции. В Twig существует несколько способов доступа к массивам. Один из них использует нотацию foo['bar']
, как и в PHP. Таким образом, к городу первого адреса можно получить доступ с помощью {{ i.address[0].city }}
.
{{ я }}
Это ваш гостевой объект. {{ 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 %}