2

我有一个具有 One Itineraries 对象的假期模型。Itineraries 对象有一个 holiday_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 对象为空(未添加/保存)。

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

  2. saveitinerary() 获取 $holiday 中的当前 Holidays 文档,检查它是否有一个与之“相关”的 Itineraries 对象,如果是则删除它并从发布的新 JSON 中添加新行程。

问题:

  1. $holiday->Itineraries 是检查假期模型中“加入”数据的正确方法吗?

1a。Itineraries::remove($holiday->Itineraries._id) 是删除现有 hasOne 相关对象的正确方法吗?

  1. 目前,它始终显示为 null,即使在数据库中创建带有 holiday_id 和其他属性的行程对象时也是如此。

  2. 似乎几乎没有“创建”关系,因为从未拾取行程,即使文档是在行程集合中创建的(使用 MongoDB shell 验证)

4

1 回答 1

2

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

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

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

于 2012-12-09T12:34:38.660 回答