Получить встроенный документ mongodb Symfony2

1

Может быть, кто-то может помочь мне в этом вопросе. У меня есть следующий документ:

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

Последняя ошибка является нормальной, поскольку я пытаюсь отобразить массив, я думаю...

Как я могу запросить эти поля адресов?

Теги:

1 ответ

0
Лучший ответ

Похоже, ваш запрос в порядке. Как говорится в сообщениях об ошибках, проблема заключается в том, что вы пытаетесь отобразить объект, который нельзя передать в строку.

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 %}


Кстати, пожалуйста, запустите имена классов с буквой в верхнем регистре. Заглавные имена классов считаются хорошей практикой в PHP и многих других языках.
  • 0
    Большое спасибо мужик !!!! Я долго искал это, и спасибо за объяснение !!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню