Пользовательские поля в документе Doctrine MongoDBPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Пользовательские поля в документе Doctrine MongoDB

Сообщение Anonymous »

У меня есть особые требования к проекту, требующие использования коллекции MongoDB, содержащей документы с разными наборами полей.

Например, эти два документа находятся в одной коллекции. Поля name и foo являются обязательными.

Код: Выделить всё

{ 'name': 'scott', 'foo': 'abc123' }
{ 'name': 'jack' , 'foo': 'def456', 'bar': 'baz' }
При использовании Doctrine MongoDB ODM поля Document будут указаны в классе Document.

На данный момент у меня есть класс Document, расширяющий следующий BaseDocument, и я создал собственный прослушиватель для события PostPersist, чтобы обновить постоянный документ с помощью пользовательского поля.

Код: Выделить всё

BaseDocument
класс:

Код: Выделить всё

class BaseDocument
{
protected $customFields;

public function __construct()
{
$this->customFields = array();
}

public function setCustomField($name, $value)
{
if (\property_exists($this, $name)) {
throw new \InvalidArgumentException("Object property '$name' exists, can't be assigned to a custom field");
}
$this->customFields[$name] = $value;
}

public function getCustomField($name)
{
if (\array_key_exists($name, $this->customFields)) {
return $this->customFields[$name];
}

throw new \InvalidArgumentException("Custom field '$name' does not exists");
}

public function getCustomFields()
{
return $this->customFields;
}
}

Код: Выделить всё

postPersist
слушатель:

Код: Выделить всё

class CustomFieldListener
{
public function postPersist(LifecycleEventArgs $args)
{
$dm = $args->getDocumentManager();
$document = $args->getDocument();

$collection = $dm->getDocumentCollection(\get_class($document));
$criteria = array('_id' => new \MongoID($document->getId()));
$mongoDoc = $collection->findOne($criteria);
$mongoDoc = \array_merge($mongoDoc, $document->getCustomFields());;
$collection->update($criteria, $mongoDoc);
}
}
Текущее решение совсем не элегантно и требует вызовов как вставки, так и обновления для вставки одного документа. Как лучше всего добавить настраиваемые поля в документ при сохранении, чтении и обновлении?

Подробнее здесь: https://stackoverflow.com/questions/145 ... b-document
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»