Поля и значения по умолчанию в MongoDB, используя cakePHP - PullRequest
0 голосов
/ 23 марта 2012

Я создаю приложение с 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;
    }

}

Очевидно, что я не могу установить значения по умолчанию непосредственно в MongoDb, например, в MySQL, и, очевидно, поскольку я задаю вопрос, вышеуказанный метод не работает.

Любые предложения о том, как я могу решить эту проблему?

Ps:

EDIT:

В настоящее время я решил эту проблему, совершив грех MVC,

Я добавляю значения по умолчанию в контроллер перед сохранением данных с моделью

<?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;
    }

  ...
  ...

class DynamicFormsController extends AppController {
    ...
    ...

    public function getForm($id=null){
    ...
    ...
        /**
         * Set defaults values
         */
        foreach ($this->DynamicFormResponse->getDefaults() as $fieldName => $defaultValue) {
                if (empty($this-> request-> data[$this-> DynamicFormResponse -> alias][$fieldName]))
                     $this->request->data[$this-> DynamicFormResponse -> alias][$fieldName] = $defaultValue;
        }
        /**
         * Data Validation 
         */
        if($this->DynamicFormResponse->save($this->request->data) == true ){
            $this->set("ticket_id",  $this->DynamicFormResponse->id);
            $this->render('ticket_successfully_saved');
            return;
        }


Есть ли лучшее решение? потому что это кажется плохим способом сделать это.

1 Ответ

4 голосов
/ 23 марта 2012

на самом деле это не вопрос 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);
}
...