У меня есть отношение один к одному в моем проекте Symfony2, где Question
имеет ссылку на Video
- оба имеют созданные и обновленные Gedmo\Timestampable< /em> поведение, которое в основном работает так, как ожидалось. Но как-то слишком:
При десериализации Question
с прикрепленным Video
(только в качестве идентификатора, чтобы избежать других изменений в метаданных видео) документ Video
всегда получает обновление как на created
, так и на поле updated
. Это не кажется правильным. Я могу понять, почему обновленное поле получает новую дату - даже если на самом деле ничего не изменилось в самом объекте, но почему создано ?
Это мой код (упрощенный):
Вопрос класса:
<?php
/**
* Class Question
*
* @Serializer\AccessorOrder("alphabetical")
* @MongoDB\Document(
* collection="Quiz",
* repositoryClass="MyNamespace\Bundle\QuizBundle\Repository\QuestionRepository",
* )
* @package MyNamespace\Bundle\QuizBundle\Document
*/
class Question
{
/**
* @var \MongoId
* @MongoDB\Id(strategy="auto")
* @Serializer\Type("string")
* @Serializer\Groups({
* "quiz_admin_list",
* "quiz_admin_detail"
* })
*/
protected $id;
/**
* @var \DateTime
*
* @Assert\Date(
* message = "quiz:constraints.model.question.created.invalid"
* )
* @Serializer\Type("DateTime<'U'>")
* @Serializer\Accessor(getter="getCreated", setter="setCreatedEmpty")
* @Serializer\Groups({
* "quiz_admin_list",
* "quiz_admin_detail"
* })
* @Gedmo\Timestampable(on="create")
* @MongoDB\Date
*/
protected $created;
/**
* @var \DateTime
*
* @Assert\Date(
* message = "quiz:constraints.model.question.updated.invalid"
* )
* @Serializer\Type("DateTime<'U'>")
* @Serializer\Accessor(getter="getUpdated", setter="setUpdatedEmpty")
* @Serializer\Groups({
* "quiz_admin_list",
* "quiz_admin_detail"
* })
* @Gedmo\Timestampable(on="update")
* @MongoDB\Date
*/
protected $updated;
/**
* @var Video
*
* @Serializer\Type("MyNamespace\Bundle\CoreMediaAdminBundle\Document\Video")
* @Serializer\Groups({
* "quiz_admin_list",
* "quiz_admin_detail"
* })
* @MongoDB\ReferenceOne(
* targetDocument="MyNamespace\Bundle\CoreMediaAdminBundle\Document\Video",
* cascade={"all"}
* )
*/
protected $answerVideo;
}
Видео класса:
<?php
/**
* Class Video
* @Serializer\AccessorOrder("alphabetical")
* @MongoDB\Document(
* collection="CoreMediaAdminVideo",
* repositoryClass="MyNamespace\Bundle\CoreMediaAdminBundle\Repository\VideoRepository",
* )
* @Vich\Uploadable
* @package MyNamespace\Bundle\CoreMediaAdminBundle\Document
*/
class Video
{
/**
* @MongoDB\Id(strategy="auto")
* @Serializer\Type("string")
* @Serializer\Groups({
* "core_media_list",
* "core_media_search",
* "core_media_video_list",
* "core_media_video_detail"
* })
*/
protected $id;
/**
* @Vich\UploadableField(
* mapping = "core_media_admin_video",
* fileNameProperty = "fileName"
* )
* @Serializer\Exclude
* @var File $file
*/
protected $file;
/**
* @MongoDB\Field(type="string")
* @Serializer\Type("string")
* @Serializer\Groups({
* "core_media_list",
* "core_media_search",
* "core_media_video_list",
* "core_media_video_detail"
* })
*/
protected $mimeType;
/**
* @var String
*
* @Assert\NotBlank(
* message = "core.media.admin:constraints.model.base.title.not_blank"
* )
* @Serializer\Type("string")
* @Serializer\Groups({
* "core_media_list",
* "core_media_search",
* "core_media_video_list",
* "core_media_video_detail"
* })
* @MongoDB\Field(type="string")
*/
protected $title;
/**
* @var \DateTime
*
* @Assert\Date(
* message = "core.media.admin:constraints.model.base.date.invalid"
* )
* @Serializer\Type("DateTime<'U'>")
* @Serializer\Accessor(getter="getCreated", setter="setCreatedEmpty")
* @Serializer\Groups({
* "core_media_list",
* "core_media_search",
* "core_media_video_list",
* "core_media_video_detail"
* })
* @Gedmo\Timestampable(on="create")
* @MongoDB\Date
*/
protected $created;
/**
* @var \DateTime
*
* @Assert\Date(
* message = "core.media.admin:constraints.model.base.date.invalid"
* )
* @Serializer\Type("DateTime<'U'>")
* _Serializer\Accessor(getter="getUpdated", setter="setUpdatedEmpty")
* @Serializer\Groups({
* "core_media_list",
* "core_media_search",
* "core_media_video_list",
* "core_media_video_detail"
* })
* @Gedmo\Timestampable(on="update")
* @MongoDB\Date
*/
protected $updated;
/**
* @var \DateTime
*
* @Assert\Date(
* message = "core.media.admin:constraints.model.base.date.invalid"
* )
* @Serializer\Type("DateTime<'U'>")
* @Serializer\Groups({
* "core_media_list",
* "core_media_search",
* "core_media_video_list",
* "core_media_video_detail"
* })
* @Gedmo\Timestampable(on="update", field={"title", "tags", "comment", "dataOrigin", "description", "videoMetaData", "mimeType", "fileName", "file" })
* @MongoDB\Date
*/
protected $updatedContent;
}
Интересно то, что в Video
объектах во время десериализации не вносятся никакие изменения - есть только запрос на обновление для установки полей created
и updated
видео. Я также протестировал поле em> для параметра Timestampable для принудительного обновления только тогда, когда одно из этих полей получает обновление, но это, похоже, полностью игнорируется.
Вот также десериализованный JSON и соответствующие запросы MongoDB:
{
"id": "547f31e650e56f2c26000063",
"question_id": 12,
"question_text": "Wer einen Gemüsegarten hat, sollte wissen, dass Schnecken…?",
"answer_text": "test",
"answer_video": {
"id": "547f31d850e56f2c26000031"
},
"tags": [
"Schnecken",
"Basilikum",
"Thymian",
"Garten"
]
}
Запросы:
db.QuizQuestion.find({
"_id": ObjectId("547f31e650e56f2c26000063")
}).limit(1).limit();
db.CoreMediaAdminVideo.update({
"_id": ObjectId("547f31d850e56f2c26000031")
},
{
"$set": {
"created": newISODate("2014-12-03T21:30:02+01:00"),
"updated": newISODate("2014-12-03T21:30:02+01:00"),
"updatedContent": newISODate("2014-12-03T21:30:02+01:00")
}
});
db.ARDBuffetQuizQuestion.update({
"_id": ObjectId("547f31e650e56f2c26000063")
},
{
"$set": {
"created": newISODate("2014-12-03T21:30:02+01:00"),
"updated": newISODate("2014-12-03T21:30:02+01:00"),
"questionText": "Wer einen Gemüsegarten hat, sollte wissen, dass Schnecken…?",
"answerText": "test",
"answerVideo": {
"$ref": "CoreMediaAdminVideo",
"$id": ObjectId("547f31d850e56f2c26000031"),
"$db": "my-database"
}
}
});
db.ARDBuffetQuizQuestion.update({
"_id": ObjectId("547f31e650e56f2c26000063")
},
{
"$set": {
"tags": [
{
"value": "Schnecken",
"normalized": "schnecken"
},
{
"value": "Basilikum",
"normalized": "basilikum"
},
{
"value": "Thymian",
"normalized": "thymian"
},
{
"value": "Garten",
"normalized": "garten"
}
]
}
});
db.ARDBuffetQuizQuestion.find({
"_id": ObjectId("547f31e650e56f2c26000063")
}).limit(1).limit();
db.CoreMediaAdminVideo.find({
"_id": ObjectId("547f31d850e56f2c26000031")
}).limit(1).limit();