读取/删除Lithium 0.11&中的相关数据/实体。 MongoDB的

时间:2012-12-06 17:45:51

标签: php mongodb mongodb-php lithium

我有一个带有一个Itineraries对象的假期模型。 Itineraries对象有一个holidays_id作为外键(由Li3约定隐含)和一个对象数组,用于存储行程每一天的信息。我使用的是Lithium 0.11和MongoDB。

  class Holidays extends \lithium\data\Model {

    public $hasOne = array('Itineraries'); 
}


   class Itineraries extends \lithium\data\Model {

    //Relationships
    public $belongsTo = array('Holidays');
}

控制器:

    public function saveitinerary()
{   

    $holidays_id = $this->request->data['holidays_id'];
    $holiday = Holidays::find($holidays_id, array('with' => 'Itineraries'));

    if($holiday->Itineraries)
    {
        Itineraries::remove($holiday->itinerary._id);   
    }

    //save the new itinerary data with added holidays_id as FK.
    $a = array('holidays_id' => $this->request->data['holidays_id'], 'Itineraries' => $this->request->data['itineraries']);

    $success = false;
    $itinerary = Itineraries::create($a);
    $success = $itinerary->save();
    if(!$success) 
        $log->LogDebug("Could not add itinerary for in db for holiday id:" . $holidays_id );
    return $itinerary->to('array');

以下是事件的顺序: 1. Holidays文档在上一页的MongoDB集合中创建并成功保存。 _id传递给基于骨干的前端。创建Holidays对象时,Itineraries对象为null(未添加/保存)。

  1. 在后续页面上,用户选择行程并向控制器(saveitinerary)发出AJAX / JSON调用,传入holidays_id和对象数组。每个对象代表假日的每一天。

  2. saveitinerary()在$ holiday中获取当前的Holidays文档,检查它是否包含一个与Itineraries对象相关的'它,如果它然后删除它并添加新的JSON发布的行程。

  3. 问题:

    1. 是$ holiday->行程正确的方式来检查“加入”'假期模型中的数据?
    2. 1a上。 Isineine :: remove($ holiday-> Itineraries._id)是删除现有hasOne相关对象的正确方法。

      1. 目前,它总是以null为空,即使在数据库中,Itineraries对象也是使用holidays_id和其他属性创建的。

      2. 似乎几乎没有任何关系'创造'因为即使在Itineraries集合中创建了文档(使用MongoDB shell验证),也永远不会选择行程

1 个答案:

答案 0 :(得分:2)

对于MongoDb没有实现AFAIK关系,因为它是一个非关系型Db,所以有一定意义,但是,链接是一种常见的做法,因为我看你的例子,这是你想要做的,所以,$ hasOne,$ hasMany和$ belongs仅适用于MySQL等RDB。

另一方面,Nate Abele发布了这个gist以及如何建立这种类型的一对一和一对多关系。 它可能需要一些调整(DocumentArray与DocumentSet合并开始)但是会完成这项工作。

如果您需要有关该代码段的帮助,请大声喊。