我在我的 Symfony2 项目中有一对一的关系,其中Question
a 引用了 a Video
- 两者都有一个创建和更新的 Gedmo\Timestampable行为,它基本上按预期工作。但是有点过分了:
反序列化Question
附加的Video
(仅作为 ID 以避免Video metadata中的其他更改)时,Video
文档始终会在thecreated
和updated
field上获得更新。这似乎不对。我可能理解为什么更新的字段会得到一个新的日期——即使对象本身实际上没有任何变化,但为什么创建?
这是我的代码(简化):
课堂问题:
<?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
字段。我还测试了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();