CakePHP - 在模型中设置默认字段值

时间:2011-12-01 15:51:41

标签: cakephp

如何为模型中的字段设置默认值?

编辑:

我已按照建议使用_schema尝试了该方法,但未使用默认值。

public $_schema = array(
    'newsletter' => array(
        'default' => 1
    ),
);  

5 个答案:

答案 0 :(得分:2)

最好在数据库中设置默认值?我真的不明白你为什么要这么做CakePHP ......

答案 1 :(得分:1)

您应该始终尝试从控制器设置默认值: http://www.dereuromark.de/tag/default-values/

答案 2 :(得分:1)

由于上述建议对我不起作用,所以我找到了自己的建议。答案与上面所写的非常相似,但只有一点修改。 (适用于CakePHP 2.6.1)

默认值可以在 add 功能的控制器中设置(需要“请求”)。

$this->request->data['Country']['hasFlag'] = 1; 

完整代码示例:

public function add() {
    if ($this->request->is('post')) {
        $this->Country->create();
        if ($this->Country->save($this->request->data)) {
            ...
        } else {
            ...
        }
    }
    $this->request->data['Country']['hasFlag'] = 1;  // default value passing to the view
}

一些哲学:
1)为什么需要这样做 - 如果我们在数据库中有一个布尔属性,Cakephp中新创建的对象不会从数据库中获取帐户默认值。如果我们在新对象的添加表单中取消选中复选框并将其提交到数据库 - 则表示此属性值为 false (不是值未设置
2)这是设置默认值的理想位置吗? - 不,这不是一个理想的地方,因为关于对象及其数据的所有信息都必须在模型中,但我没有管理在模型中指定默认值。甚至使用 _schema 变量或创建函数。

答案 3 :(得分:1)

您可以在数据库中设置值并在架构中管理它,例如:

public $items = array(
    'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'length' => 10, 'unsigned' => false, 'key' => 'primary'),
    'quantity' => array('type' => 'decimal', 'null' => false, 'default' => '1.00', 'length' => '12,2', 'unsigned' => false),
    //                                                        ^^^^^^^^^^^^^^^^^^^
    'indexes' => array(
        'PRIMARY' => array('column' => 'id', 'unique' => 1),
    ),
    'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_spanish_ci', 'engine' => 'InnoDB')
);

稍后可以通过模型的schema属性在模型或控制器中读取此默认值:

// Controller example
$itemSchema = $this->Item->schema();
$defaultQuantity = $itemSchema['quantity']['default'];
// ... or:
$quantityInfo = $this->Item->schema('quantity');
$defaultQuantity = $quantityInfo['default'];

在最近的PHP版本中,它可以是一行代码:

$defaultQuantity = $this->Item->schema('quantity')['default'];

这适用于带有MySQL适配器的Cake / 2.5(不知道其他场景)。

答案 4 :(得分:0)

数据库变大,所以你不记得你设置的所有默认值。让我们保持简单:

  1. 您可以在控制器中设置默认值(如果某些操作的默认值在开头设置为类属性,则很容易读取代码。)
  2. 例如:

    class UsersController extends AppController {
    private $registerDefaults = array(
        'group_id' => '1'
    );
    
    public function register() {
        if ($this->request->is('post')) {
            /*
            * This is where you set default value
            * Here's what I do for default group that user should be assigned to
            */
            $this->request->data['User']['group_id'] = $this->registerDefaults['group_id'];
    
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('You have been successfully registered.'));
                return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash(__('We're unable register this user.'));
        }
    }
    }
    

    如果您有大约60-80个关系复杂的表格,则无法始终记住数据库中设置的默认值。

    我的建议是你不要设置依赖于你当前设置的默认值,更灵活:创建配置表或在AppController中设置默认值,以便眨眼间找到它。