Ответ 1
Это должен быть тип Hash:
У меня есть простой вопрос о (кстати, очень здорово!) 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 из Германии)
Это должен быть тип Hash:
Для версий до ODM 2.0 @Hash предоставит необходимый тип данных. Однако после удаления ODM 2.0 @Hash. Чтобы использовать его, мы должны использовать @field с типом hash.
Для дальнейших ссылок [click here][1]
Я думаю, что вы ищете тип hash
данных. Не так ли?
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @Document
*/
class Test
{
/** @Id */
public $id;
/**
* @MongoDB\Field(type="hash")
*/
public $field;
}
Лучший ответ - использование хеш-типа. Но если по какой-то причине вы не хотите использовать 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;
// ...
}
@Array должен работать. По крайней мере эквивалент существует в ORM (@Column (type = "array" ))