Подтвердить что ты не робот

Какой тип отображения выбрать для ассоциативных массивов? Доктрина 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 я должен использовать для сохранения пар ключ-значение в базе данных?

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

Анди (greetz из Германии)

4b9b3361

Ответ 2

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

Ответ 3

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

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

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

    /**
     * @MongoDB\Field(type="hash")
    */
    public $field;
}

Ответ 4

Лучший ответ - использование хеш-типа. Но если по какой-то причине вы не хотите использовать 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;

    // ...
}

Ответ 5

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