如何让模型在Phalcon PHP框架中使用默认值?

问题描述:

如果某个表在某些字段上有默认值,并且不允许NULL,那么可以期望插入脚本使用这些默认值,正如MariaDB/MySQL通常所做的那样。例如,如果表产品具有AI字段“ID”,必需的字段“name”和两个所需字段“活性”和“功能的”,这两个默认为1,则查询如何让模型在Phalcon PHP框架中使用默认值?

INSERT INTO products (name) VALUES ('someName'); 

自动插入1作为活动和特色的值。但是,如果使用Phalcon的型号,如下所示:

$product = new Products(); 
$product->setName('someName'); 
$product->save(); 

返回验证错误,说明“active”和“featured”是必需的。

有没有我应该为了尔康工具来收集和输入的默认设置成模型类,或另一种方式让多尔康自动使用默认值,如果发现模型生成过程中提供一个标志?我认为最好的方法就是忽略那些没有设置的字段。我可以让模型做到这一点吗?

您可以使用原始数据库值,以避免这种情况,在特定的刀片:

<?php 

use Phalcon\Db\RawValue; 

$product = new Products(); 
$product->setName('someName'); 
$product->setType(new RawValue('default')); //use default here 
$product->save(); 

或者,一般前创建/更新的具体领域:

use Phalcon\Db\RawValue; 

class Products extends Phalcon\Mvc\Model 
{ 
    public function beforeValidationOnCreate() 
    { 
     $this->type = new RawValue('default'); 
    } 
} 

或忽略每个这些领域SQL插入生成:

use Phalcon\Db\RawValue; 

class Products extends Phalcon\Mvc\Model 
{ 
    public function initialize() 
    { 
     $this->skipAttributesOnCreate(array('type')); 
    } 
} 
+1

亮,由于 – Swader 2013-04-11 15:42:14

+0

@twistedxtra小的改进:'$这 - >类型= $这个 - >类型:新RawValue( '缺省');'?。但无论如何 - 谢谢! :) – klay 2014-12-28 20:21:51

虽然我发现twistedxtra的答案迷人的aspe ct Phalcon包含了这个邪恶的方法来读取列默认值,我相信从架构的角度来看,这可能是错误的方法,因为您依赖数据库来定义模型属性的默认值。

声明属性时我将设置的默认值,并保持在逻辑应用层。但那只是我。

+0

“正确”的架构方法不是在数据库层面强制实施这种默认方式吗?至少这样你永远不会收到不好的数据。 – 2014-12-04 05:11:35

使用如下

的skipAttributesOnCreate将确保尔康并不试图把一个值在该列。数据库将应用默认值。

public function initialize() 
{ 
    $this->setSource('table_name'); 
    $this->skipAttributesOnCreate(['name_of_column']); 
} 
+1

嗨德吉,欢迎来到*。在回答问题时,应始终提供解释和说明以帮助解决手头的问题。发布代码块通常没有帮助,它不提供上下文。请考虑在这里更新您的答案。 – 2016-10-18 17:28:00