我有一个带有一个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(未添加/保存)。
在后续页面上,用户选择行程并向控制器(saveitinerary)发出AJAX / JSON调用,传入holidays_id和对象数组。每个对象代表假日的每一天。
saveitinerary()在$ holiday中获取当前的Holidays文档,检查它是否包含一个与Itineraries对象相关的'它,如果它然后删除它并添加新的JSON发布的行程。
问题:
1a上。 Isineine :: remove($ holiday-> Itineraries._id)是删除现有hasOne相关对象的正确方法。
目前,它总是以null为空,即使在数据库中,Itineraries对象也是使用holidays_id和其他属性创建的。
似乎几乎没有任何关系'创造'因为即使在Itineraries集合中创建了文档(使用MongoDB shell验证),也永远不会选择行程
答案 0 :(得分:2)
对于MongoDb没有实现AFAIK关系,因为它是一个非关系型Db,所以有一定意义,但是,链接是一种常见的做法,因为我看你的例子,这是你想要做的,所以,$ hasOne,$ hasMany和$ belongs仅适用于MySQL等RDB。
另一方面,Nate Abele发布了这个gist以及如何建立这种类型的一对一和一对多关系。 它可能需要一些调整(DocumentArray与DocumentSet合并开始)但是会完成这项工作。
如果您需要有关该代码段的帮助,请大声喊。