Встроенный документ и ассоциативный массив php, как в mongodb с доктриной? - PullRequest
1 голос
/ 23 марта 2011

Привет, после нескольких часов поиска, я наконец сдаюсь, я не могу найти какой-либо способ сделать это, я хочу знать, возможно ли создать отношение EmbedMany, используя ассоциативный массив php.

Я могу использовать @field (type = "hash"), но затем я не могу добавить встроенный документ к этому ключу!

Вот код, который у меня сейчас есть:

<?php

namespace Entity;

/**
 * @Document(collection="object_types")
 */
class OType
{
    /**
     * @Id
     * @var integer
     */
    private $id;

    /**
     * @Field(type="string")
     * @var string
     */
    private $name;

    /** 
     * @EmbedMany(targetDocument="Property")
     */
    private $properties = array();

    /**
     * Node Type
     *
     * @param string $name
     */
    public function __construct($name)
    {
        $this->name = $name;


    }

    /**
     * Set name
     *
     * @param string $name
     * @return void
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Add property
     *
     * @param Property $property
     */
    public function addProperty(Property $property)
    {
        $this->properties[$property->getName()] = $property;
    }

    /**
     * Get properties
     *
     * @return Property[]
     */
    public function getProperties()
    {
        return $this->properties;
    }
}

Я хочусделать что-то вроде этого:

$property = new Property();
$property->setName('memberof');
$property->setType('string');

$type = new OType();
$type->setName('user');
$type->addProperty($property);

И получить такой результат:

{
  "_id": {
    "$oid": "4d89ae2c2eea0f8406000004"
  },
  "name": "user",
  "properties": [
    "memberof": {
      "name": "memberof",
      "type": "string"
    }
  ]
}

Спасибо за помощь.

С наилучшими пожеланиями Flamur

Ответы [ 3 ]

4 голосов
/ 11 апреля 2012

На самом деле, вы МОЖЕТЕ, используйте strategy="set" Например:

@EmbedMany(targetDocument="Field", strategy="set")

Обязательно прочитайте ДОКУМЕНТУ документации по коллекциям:

http://docs.doctrine -проект.org / projects / doctrine-mongodb-odm / ru / latest / reference / reference-mapping.html

0 голосов
/ 03 мая 2013

Вы не должны этого делать (просто придерживайтесь одного способа сделать это: или вы всегда используете ассоциативный массив, или вы используете встроенные документы)

Однако этот трюк может помочь:

Просто преобразуйте значения в массиве свойств, чтобы они все были объектами свойств.

//Add to your document:
/** @PostLoad */
public function postLoad()
{
    foreach($this->properties as $k => $p) {
        if(is_array($p)) {
            $newP = new Property();
            $newP = $p['name'];
            //..
            $this->properties[$k] = $newP;
        }
    }
}
0 голосов
/ 04 апреля 2011

Боюсь, вы не можете этого сделать.

Обязательно прочитайте документацию доктрины по коллекциям: http://www.doctrine -project.org / docs / mongodb_odm / 1.0 / en / reference /справочно-mapping.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...