Какой тип отображения выбрать для ассоциативных массивов?Доктрина ОДМ - PullRequest
12 голосов
/ 15 ноября 2010

У меня есть простой вопрос о (кстати, действительно здорово!) Доктрине 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 следует использовать для сохранения пар ключ-значение в базе данных?

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

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

Ответы [ 5 ]

17 голосов
/ 29 ноября 2010
1 голос
/ 20 сентября 2016

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

0 голосов
/ 07 июля 2019

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

Если вы используете тип хеша, значения в ассоциативном массиве передаются в MongoDB напрямую, без подготовки. Только форматы подходит для водителя Монго должен быть использован. Если ваш хеш содержит значения, которые не подходят, вы должны использовать встроенный формат документа или использования, предоставляемый драйвером 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;

    // ...
}
0 голосов
/ 11 мая 2018

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

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

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

    /**
     * @MongoDB\Field(type="hash")
    */
    public $field;
}
0 голосов
/ 16 ноября 2010

@ Массив должен работать.В ORM существует хотя бы эквивалент (@Column (type = "array"))

...