我使用https://github.com/ichikaway/cakephp-mongodb.git插件访问mongodb数据源。
我有两个模特:教师和主题。我希望在教师和主题上共同找到结果。 这是我的两个模型: 师:
<?php
class Teacher extends AppModel {
public $actsAs = array('Containable');
public $hasOne = array('Subject');
public $primaryKey = '_id';
var $mongoSchema = array(
'name'=>array('type'=>'string'),
'age'=>array('type'=>'string'),
'subjectid'=>array('type'=>'string'),
'created'=>array('type'=>'datetime'),
'modified'=>array('type'=>'datetime'),
);
主题:
<?php
class Subject extends Model {
public $actsAs = array('Containable');
public $belongsTo= array('Teacher');
public $primaryKey = '_id';
var $mongoSchema = array(
'name'=>array('type'=>'String'),
'code'=>array('type'=>'String'),
'created'=>array('type'=>'datetime'),
'modified'=>array('type'=>'datetime')
);
在教师控制器中获得联合结果,我做了:
$results = $this->Teacher->find('all',array('contain'=>array('Subject')));
$this->set('results', $results);
但我没有从主题收藏中得到任何结果。
这是我得到的:
array(5) {
[0]=>
array(1) {
["Teacher"]=>
array(7) {
["_id"]=>
string(24) "52e63d98aca7b9ca2f09d869"
["name"]=>
string(13) "Jon Doe"
["age"]=>
string(2) "51"
["subjectid"]=>
string(24) "52e63c0faca7b9272c09d869"
["modified"]=>
object(MongoDate)#78 (2) {
["sec"]=>
int(1390820760)
["usec"]=>
int(392000)
}
["created"]=>
object(MongoDate)#79 (2) {
["sec"]=>
int(1390820760)
["usec"]=>
int(392000)
}
}
}
我只是一个cakephp / mongoDB新手,请指导我获得理想的结果。
编辑:我读到mongoDb不支持加入操作。那么如何手动完成呢?我的意思是我可以在每个模型上写两个查找查询,然后如何组合两个数组并将其设置为查看?
答案 0 :(得分:0)
正如您所说,MongoDB不支持连接。查询结果中的文档直接来自要查询的集合。
在这种情况下,我想你会查询教师文档然后迭代所有文档并通过subjectid
字段查询主题文档,将生成的主题文档存储在教师的新属性中。我不熟悉这个CakePHP模块,但您可能需要或不需要在查询之前将subjectid
字符串值包装在MongoId对象中。这取决于MongoDB中的文档_id
字段是否为ObjectIds或纯字符串。
如果主题只属于单个教师,并且您发现您从未在教师的上下文之外查询主题,您可能需要考虑嵌入主题而不是简单地存储其标识符。这样就无需在事后查询主题。