如何在CakePHP中添加/插入子文档数组?

时间:2013-05-26 17:19:47

标签: php mongodb cakephp mongodb-php

好的,所以我在这个网站和谷歌上做了很多搜索并找到了一些答案,但没有一个有效。我也检查了@ ichikaway的网站和测试程序。即使那里的东西也不适合我。另外,当使用'if'语句包装save / update时,它总是返回true,所以我可以做的调试不多。

以下是可能有助于您指导解决方案的相关代码。谢谢!

MyClass模型定义

class MyClass extends AppModel 
{
var $name = 'MyClass';
var $useTable = 'my_classes';

//var $belongsTo = array();
//var $hasMany = array();

var $useDbConfig = 'mongo';

var $mongoSchema = array(
        '_id' => array('type' => 'integer', 'primary' => true, 'length' => 40),
        'children' => array(
                'child_id' => array('type' => 'integer','length' => 40),
                'child_first_name' => array('type'=>'string'),
                'child_last_name'=>array('type'=>'string'),
                'active'=>array('type' => 'integer', 'length' => 1),
        ),
        'teachers' => array(
                'teacher_id' => array('type' => 'integer','length' => 40),
                'teacher_first_name' => array('type'=>'string'),
                'teacher_last_name'=>array('type'=>'string'),
                'primary'=>array('type' => 'integer', 'length' => 1),
                'active'=>array('type' => 'integer', 'length' => 1),
        ),
        'name' => array('type'=>'string'),
        'active'=>array('type' => 'integer', 'length' => 1),
        'created'=>array('type'=>'datetime'),
        'modified'=>array('type'=>'datetime'),
        );
}

来自我的StudentsController的代码

$currentClass = $this->data["MyClass"]["id"];

$classtoedit = $this->MyClass->findById($currentClass);

$addChildToClass = array(
    'MyClass' => array('id'=>$currentClass,
    '$push' => 
        array('children' => 
        array('child_id'=>$newChildId,
            'child_first_name'=>$first_name,
            'child_last_name'=>$last_name,
            'active'=> 1)
        )
      )
    );

print_r($addChildToClass);
$this->MyClass->id = $currentClass;
if($this->MyClass->save($addChildToClass))
{
$this->Session->setFlash("Your child has been successfully added.");

}

修改 我只能通过PHP术语获得我需要的功能,但同样,我真的想在CakePHP中以正确的方式完成它。我宁愿不把两者混合在一起,以便任何其他维护人员可能跟我一起。 FYI

2 个答案:

答案 0 :(得分:0)

documentation开始,您似乎还需要使用mongoNoSetOperator

tests中有一些使用示例。

我还认为您需要使用_id而不是id。在您的用例中,您尝试更新现有记录,以便在驱动程序代码调用insert而不是update时,您应该获得重复的密钥异常。

答案 1 :(得分:0)

我想强调两件事,如果我错了,请告诉我。

1)为什么要在数组变量$addChildToClass和其他$this->MyClass->id = $currentClass;

中设置两次id

2)什么是关键''$ push'in the $ addChildToClass`?

我想如果你将尝试使用类似的东西......那么它将起作用

$addChildToClass = array(
    array('children' => 
    array('child_id'=>$newChildId,
        'child_first_name'=>$first_name,
        'child_last_name'=>$last_name,
        'active'=> 1)
  )
);

因为您在更新字段之前设置了id的任何方式。