我正在使用cakephp 2.1
和mongodb 2.03
构建应用程序,我正在使用ishikaway的mongodb数据源
我需要设置一些默认值,这些值将被添加到模型中,我正在这样做
<?php
class DynamicFormResponse extends AppModel{
public $useDbConfig = 'mongodb';
public $useTable = 'dynamicFormsResponse';
public $primaryKey = '_id';
public $validate=array();
public $mongoschema = array(
'created' => array('type' => 'datetime'),
'modified' => array('type' => 'datetime'),
'escalation'=>array(
'type'=>"integrer",
"default"=>0
),
"status"=>array(
"type"=>"string",
"default"=>"pending"
),
);
public function setSchema($schema) {
$this->_schema=$schema;
}
public function getSchema(){
return $this->_schema;
}
}
很明显,我不能像MySQL那样直接在MongoDb中设置默认值,而且很明显,由于我在问这个问题,上面的方法不起作用。
关于如何解决这个问题,有什么建议吗?
Ps:
- 这对CakePHP在模型中设置默认字段值没有帮助
- 文件也不清楚
- 此处提供完整代码
编辑:
我目前已经通过提交一个MVC sin,来解决这个问题
在用型号保存数据之前,我正在控制器中添加默认值
<?php
class DynamicFormResponse extends AppModel {
public $name="DynamicFormResponse";
public $useDbConfig = 'mongodb';
public $useTable = 'dynamicFormResponse';
public $primaryKey = '_id';
public $validate = array();
public function getDefaults(){
$defaultValues=array(
"escalation"=>0,
"status"=>"pending",
"department_id"=>NULL,
"user_agent"=>env("HTTP_USER_AGENT")
);
return $defaultValues;
}
...
...
类DynamicFormsController扩展AppController{。。。。。。公共函数getForm($id=null){。。。。。。/***设置默认值*/foreach($this->DynamicFormResponse->getDefaults()作为$fieldName=>$defaultValue){if(空($this->request->data[$this->DynamicFormResponse->alias][$fieldName]))$this->request->data$$this->DynamicFormResponse->alias][$fieldName]=$defaultValue;}/***数据验证*/if($this->DynamicFormResponse->save($this->request->data)==true){$this->set("ticket_id",$this-->DynamicFormResponse->id);$this->render('ticket_successfully_saved');回来}
有更好的解决方案吗?因为那样做似乎不好。
这不是一个mongoDB问题,但无论如何,我建议您将用户数据与beforeSave()中的默认值合并。
我们在每个模型中声明默认值如下:
public $defaultValues = array(
'report' => 't',
'reportinterval' => '7',
'type' => '0'
);
并将其合并到beforeSave()中:
/**
* Extends beforeSave() to add default values
*
* @param array $options
* @return bool
*/
public function beforeSave($options = array()) {
// Add default values if not set already
foreach ($this->defaultValues as $fieldName => $defaultValue) {
if (empty($this->data[$this->alias][$fieldName]))
$this->data[$this->alias][$fieldName] = $defaultValue;
}
return parent::beforeSave($options);
}