2015-11-26 4 views
1

Моя проблема заключается в следующем: У меня есть база данных Монго, которая хранит такие объекты { "name":"Accord Neo", "number_of_photos":"3", "id":"accord_neo", "description":"Very comfortable sofa.", "details": { "chair_is": false, "Sofa_bed": "delfin", "Structure_configuration": "corner" }, "properties":[ { "property":"2-У-1", "value":"2150 X 1550 X 880" }, { "property":"Sleeping place", "value":"2150 X 1550 X 880" } ] }​Symfony2 и DoctrineMongoDB ODM: Пользовательские Типы отображения

Мне нужно получить эти объекты в Symfony2 с использованием Doctrine типов отображения и проблема заключается в том, что я не понимаю, как создать мои пользовательские классы для отображения для поля «подробности» и поля «свойства». Я попытался сделать аналогию с официального сайта доктрины http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/basic-mapping.html#custom-mapping-types , но я все еще не понимаю, как это работает и как оно должно быть реализовано в моем случае.

ответ

0

Создайте новый документ для «деталей», как это:

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 

/** 
* @MongoDB\EmbeddedDocument 
*/ 
class Details 
{ 
} 

Обратите внимание, что это embeddeddocument так она будет храниться в рамках одной записи в MongoDB. Сделайте то же самое для свойства

Затем в родительском объекте, встраивать их набор и создать коллекцию в конструкторе:

/** 
* @MongoDB\EmbedOne(targetDocument="Details") 
*/ 
protected $details; 

/** 
* @MongoDB\EmbedMany(targetDocument="Properties") 
*/ 
protected $propertieslist; 

public function __construct() 
{ 
     $this->propertieslist = new ArrayCollection(); 
} 

Вы можете создать свои сеттер и добытчик с помощью инструментов, которые приходят с симфонией.

Предполагая, что вы используете Forms для управления ими, вам необходимо создать FormType для каждого встроенного документа.

Для получения дополнительной информации вы просто переходите к «новому ПодробнееТип» в качестве своего типа (в отличие от «текста» или «выбора»).

Для свойств вам нужно будет добавить «коллекцию», а затем передать массив, где «type» => newStyleType. Чтобы добавить и удалить динамически, потребуется немного javascript. Подробности здесь: http://symfony.com/doc/current/cookbook/form/form_collections.html

+0

благодарит вас за ответ @Xaraxia, всего лишь одна мелочь: что должно быть написано внутри класса «Детали» и «Свойства»? Я думал, что я должен объявить также каждое свойство для «деталей» и того же для «свойств». – Jack

+0

Да, да. Я предполагал, что вы поняли основную структуру документа, потому что она выложена на странице, которую вы связали. Встроенный документ точно такой же. защищенный $ chair_is; защищенный $ Sofa_bed; protected $ Structure_configuration; – Xaraxia