Doctrine / MongoDB: используйте пары ключ-значение вместо числового массива - PullRequest
2 голосов
/ 27 декабря 2010

Я использую Doctrine ODM с MongoDB. У меня есть «модель продукта», как это:

namespace Cms\Model;

/** @Document(collection="products") */
class Product
{
    /** @Id */
    private $id;

    /** @String */
    private $title;

    /** @String */
    private $description;

    /** @Date */
    private $createdAt;

    /** @EmbedMany(targetDocument="Cms\Model\ProductParam") */
    private $params;

    /** @EmbedOne(targetDocument="Cms\Model\Coordinate") */
    private $coordinate;

    public function  __construct()
    {
        $this->details = new \Doctrine\Common\Collections\ArrayCollection();
        $this->params = new \Doctrine\Common\Collections\ArrayCollection();
    }
}

Моя модель ProductParam выглядит следующим образом:

namespace Cms\Model;

/** @EmbeddedDocument */
class ProductParam
{
    /** @String */
    private $type;

    /** @String */
    private $value;
}

Когда я вставляю документы с этой схемой, результат будет следующим:

{
   "_id": ObjectId("4d17ac603ffcf6d01300002a"),
   "title": "Peugeot 206 2001-X-Reg, 1.4lx Air-con, 12 months mot, Credit Cards Accepted.",
   "description": "PEUGEOT 206 1.4LX IMMACULATE THROUGHOUT DRIVES ABSOLUTELY SUPERB",
   "params": {
     "0": {
       "type": "carBrand",
       "value": "PEUGEOT"
    },
     "1": {
       "type": "carModel",
       "value": "206 LX"
    }
}

Но мне нужно вот что:

{
   "_id": ObjectId("4d17ac603ffcf6d01300002a"),
   "title": "Peugeot 206 2001-X-Reg, 1.4lx Air-con, 12 months mot, Credit Cards Accepted.",
   "description": "PEUGEOT 206 1.4LX IMMACULATE THROUGHOUT DRIVES ABSOLUTELY SUPERB",
   "params": {
     carBrand: "PEUGEOT",
     carModel: "206 LX"
   }
}

Как я могу это сделать? Спасибо.

Ответы [ 2 ]

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

Я предлагаю вам не использовать PostLoad, PrePersist и т. Д., Поскольку это будет очень дорого, вместо этого используйте strategy="set" Например:

@EmbedMany(targetDocument="Field", strategy="set")
0 голосов
/ 19 апреля 2011

Вы можете использовать тип @Hash, но он ссылается только на ассоциативный массив, а не на другой объект. Но вы используете это в сочетании с PostLoad и PrePersist событиями для преобразования между объектом и ассоциативным массивом.

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