如何通过连接两个集合(表)来获得结果[Cakephp / MongoDB]

时间:2014-01-27 12:16:56

标签: mongodb cakephp cakephp-2.3

我使用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不支持加入操作。那么如何手动完成呢?我的意思是我可以在每个模型上写两个查找查询,然后如何组合两个数组并将其设置为查看?

1 个答案:

答案 0 :(得分:0)

正如您所说,MongoDB不支持连接。查询结果中的文档直接来自要查询的集合。

在这种情况下,我想你会查询教师文档然后迭代所有文档并通过subjectid字段查询主题文档,将生成的主题文档存储在教师的新属性中。我不熟悉这个CakePHP模块,但您可能需要或不需要在查询之前将subjectid字符串值包装在MongoId对象中。这取决于MongoDB中的文档_id字段是否为ObjectIds或纯字符串。

如果主题只属于单个教师,并且您发现您从未在教师的上下文之外查询主题,您可能需要考虑嵌入主题而不是简单地存储其标识符。这样就无需在事后查询主题。