Какой тип сопоставления выбрать для ассоциативных массивов? Доктрина ODM

У меня простой вопрос по поводу (кстати, действительно отличной!) Doctrine ODM.

Предположим, у вас есть такой документ:

/**
 * @Document
 */
class Test
{
    /** @Id */
    public $id;
    /** @WHICHTYPE */
    public $field = array();
}

Теперь я хочу сохранить ассоциативный массив, например

array("test" => "test1", "anothertest" => "test2", ......);

В свойстве $ field этого класса.

Я знаю, что для MongoDB нет проблем, но в Doctrine, когда я использую, например, @Collection или просто @Field, сохраняются только значения (например, array_values ​​используется в драйвере сопоставления для сбора). Таким образом, сохраненное значение выглядит как

array("test1", "test2", ....)

Кто-нибудь знает, какой тип сопоставления Doctrine-ODM я должен использовать, чтобы сохранить пары ключ-значение в базе данных?

Заранее спасибо,

Анди (привет из германии)


person Andreas Schmidt    schedule 15.11.2010    source источник


Ответы (5)


Это должен быть тип хэша:

http://readthedocs.org/docs/doctrine-mongodb-odm/en/latest/reference/annotations-reference.html?highlight=hash#hash

person Florian Klein    schedule 29.11.2010

Для версий до ODM 2.0 @Hash предоставит необходимый тип данных. Однако после ODM 2.0 поле @Hash удаляется. Чтобы использовать его, мы должны использовать @field с типом hash. Для получения дополнительной информации [click here][1]

person iffi    schedule 20.09.2016

Я думаю, вы ищете тип данных hash. Не так ли?

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

/**
 * @Document
 */
class Test
{
    /** @Id */
    public $id;

    /**
     * @MongoDB\Field(type="hash")
    */
    public $field;
}
person Omar Alves    schedule 11.05.2018

Лучший ответ - использовать тип хеша. Но если по какой-то причине вы не хотите использовать тип hash, вы можете использовать функцию EmbeddedDocument, предоставляемую Doctrine ODM, как сказано в документации:

Если вы используете хэш-тип, значения в ассоциативном массиве передаются в MongoDB напрямую, без подготовки. Следует использовать только форматы, подходящие для драйвера Mongo. Если ваш хэш содержит значения, которые не подходят, вы должны либо использовать встроенный документ, либо использовать форматы, предоставляемые драйвером MongoDB (например, \ MongoDate вместо \ DateTime).

Итак, вам нужно создать EmbeddedDocument EmbeddedExample в AppBundle\Document\EmbeddedExample.php:

<?php

namespace AppBundle\Document;

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

/**
 * @MongoDB\EmbeddedDocument()
 */
class EmbeddedExample
{
    /**
     * @MongoDB\Field(type="int")
     */
    protected $some_name;

    // ...
    // getter and setter
}

Затем вы можете использовать EmbeddedExample в своем Test документе. Таким образом, файл Test.php будет похож на этот:

<?php

namespace AppBundle\Document;

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

/**
* @MongoDB\Document(repositoryClass="AppBundle\Repository\TestRepository")
*/
class Test
{

    /** @MongoDB\EmbedOne(targetDocument="EmbeddedExample") */
    private $field;

    // ...
}
person ASSILI Taher    schedule 07.07.2019

@Array должен работать. По крайней мере, эквивалент существует в ORM (@Column (type = "array"))

person beberlei    schedule 16.11.2010
comment
это настоящий бесполезный ответ - person Chris; 29.05.2013