Как вы сохраняете ObjectId при использовании Doctrine MongoDB ODM? - PullRequest
4 голосов
/ 11 июля 2011

Я хочу хранить ссылки вручную, а не позволять ODM использовать тип DBRef.

У меня есть возможность сохранить _id, на который я хочу ссылаться, как @String (например, "4e18e625c2749a260e000024"), но как вместо этого сохранить в этом поле экземпляр ObjectId?

new \MongoId("4e18e625c2749a260e000024") <-- what's the annotation for this type?

Сохранение его с использованием объекта MongoId вместо строки сэкономит мне половину пространства в этом поле. Это тот же тип данных, который используется аннотацией @Id, но @Id можно использовать в документе только один раз.

Какая правильная аннотация для этого?

Ответы [ 2 ]

9 голосов
/ 12 июля 2011

Обновление: Теперь есть официальная поддержка для этого типа. Используйте @ObjectId или @Field(type="object_id") в аннотации для использования типа ObjectId / MongoId. Нет необходимости использовать решение ниже.

Кроме того, используйте последний мастер-код с github.com/doctrine/mongodb-odm и избегайте использования версии на веб-сайте (она устарела).


Решение (устарело)

Похоже, это пока не поддерживается. Я обсуждал этот вопрос на канале IRC и открыл билет здесь: https://github.com/doctrine/mongodb-odm/issues/125

Временным исправлением будет определение пользовательского типа и использование аннотации типа @Field(type="objectid") в ваших классах Document.

Вот код для пользовательского типа, который я использую для этого.

/**
 * Custom Data type to support the MongoId data type in fields
 */
class ObjectId extends \Doctrine\ODM\MongoDB\Mapping\Types\Type
{
    public function convertToDatabaseValue($value)
    {
        if ($value === null) {
            return null;
        }
        if ( ! $value instanceof \MongoId) {
            $value = new \MongoId($value);
        }
        return $value;
    }

    public function convertToPHPValue($value)
    {
        return $value !== null ? (string)$value : null;
    }
}

Зарегистрируйте его, используя

\Doctrine\ODM\MongoDB\Mapping\Types\Type::addType('objectid', 'ObjectId' );
0 голосов
/ 12 июля 2011

Попробуйте:

/** @Id(strategy="NONE") */
...