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



我有一个Holidays模型,它有一个Itineraries对象。Itineraries对象有一个holidays_id作为外键(由Li3约定暗示),以及一组存储行程中每天信息的对象。我使用的是Lithium 0.11和MongoDB。

class Holidays extends lithiumdataModel {
public $hasOne = array('Itineraries'); 
}

class Itineraries extends lithiumdataModel {
//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. 在随后的页面上,用户选择行程,并对控制器进行AJAX/JSON调用(saveroutine),传入holiday_id和对象数组。每个对象表示节日的每一天。

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

问题:

  1. $holiday->行程是检查Holidays模型中"已加入"数据的正确方式吗

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

  1. 目前,它总是显示为null,即使在数据库中使用holiday_id和其他属性创建了Itineraries对象。

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

AFAIK关系没有为MongoDb实现,这是有意义的,因为它是一个非关系型Db,然而,链接是一种常见的做法,当我查看您的示例时,这正是您想要做的,所以$hasOne、$hasMany和$attributes只适用于MySQL等RDB。

另一方面,Nate Abele发布了关于如何建立一对一和一对多关系的要点。它可能需要一些调整(DocumentArray最初与DocumentSet合并),但可以完成任务。

如果你需要帮助的话,大声喊一声。

最新更新