Symfony2 MongoDB持久化对象未保存到数据库

时间:2014-12-22 12:02:41

标签: php mongodb symfony

我的数据库中的对象Ticket具有以下结构:

{
  "_id" : ObjectId("549803361bac2fa81a000029"),
  "amount" : 1,
  "price" : 123000,
  "phone" : "+111 (11) 111-11-11",
  "status" : 1,
  "is_admin_added" : 1,
  "created" : ISODate("2014-12-22T11:39:52.000Z"),
  "event" : {
    "_id" : ObjectId("549803361bac2fa81a00002a"),
    "name" : "helicopter",
    "start_date" : ISODate("2014-12-31T08:11:00.000Z"),
    "city" : {
        "_id" : ObjectId("549026601bac2f5811000033"),
        "name" : "cityname"
    }
  }
}

这是Ticket对象的yml配置:

Bnv\BnvBundle\Document\Ticket:
  fields:
    id:
        id:  true
    amount:
        type: int
    price:
        type: int
    phone:
        type: string
    additional:
        type: string
    status:
        type: int
    is_admin_added:
        type: int
    created:
        type: date
    user_id:
        type: int
  repositoryClass: Bnv\BnvBundle\Repository\TicketRepository
  embedOne:
    event:
        targetDocument: Event
        cascade: all

我可以正常保存新的Ticket对象及其新的后代 - 对象事件和对象城市 - 当我创建Ticket对象时。

但是如果我尝试编辑该值,我无法保存嵌入文件名称的新值。这是我的编辑代码:

$dm = $this->get('doctrine_mongodb')->getManager();
$ticket = $dm->getRepository('BnvBnvBundle:Ticket')->find($id);
$ticket->setPrice($price);
$ticket->setPhone($phone);
$event = $ticket->getEvent();
$event->setName($eventName);
$dm->persist($ticket);
$dm->persist($event);
$dm->flush();

此票证的价格和电话已成功保存,但事件名称未在数据库中更改(事件名称仅在我调试上述代码时在对象中更改,但在刷新后不在数据库中更改)

我无法理解为什么。求助,请理解,原因是什么。谢谢。

1 个答案:

答案 0 :(得分:1)

好的,发现了问题。方法

$this->mongoCollection->update($query, $newObj, $options);
vendor/doctrine/mongodb/lib/Doctrine/MongoDB/Collection.php中的

实际上更改了对象事件集合“事件” - 嵌入对象事件对象票证。所以我认为在mongodb中嵌入文档不适合编辑,或者在告诉symfony事件嵌入文档时我错过了一些设置。

编辑:

这种行为是由于yml配置中不存在type: embeddedDocument(第一个字母 - 小写)。没有这个字符串文档每次添加新文档Ticket时,事件都保存在单独的集合中