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

如何使模型在Phalcon PHP框架中使用默认值?,php,frameworks,phalcon,Php,Frameworks,Phalcon,如果一个表在某些字段上有默认值,并且不允许NULL,那么可以期望insert脚本使用这些默认值,就像MariaDB/MySQL通常所做的那样。例如,如果表产品有一个AI字段“id”、一个必填字段“name”和两个必填字段“active”和“featured”,它们都默认为1,则查询 INSERT INTO products (name) VALUES ('someName'); 自动插入1作为active和featured的值。但是,当使用Phalcon的模型时,如下所示: $product

如果一个表在某些字段上有默认值,并且不允许NULL,那么可以期望insert脚本使用这些默认值,就像MariaDB/MySQL通常所做的那样。例如,如果表产品有一个AI字段“id”、一个必填字段“name”和两个必填字段“active”和“featured”,它们都默认为1,则查询

INSERT INTO products (name) VALUES ('someName');
自动插入1作为active和featured的值。但是,当使用Phalcon的模型时,如下所示:

$product = new Products();
$product->setName('someName');
$product->save();
返回验证错误,说明“活动”和“特色”是必需的


在模型生成过程中,我是否应该提供一个标志,以便Phalcon工具获取默认值并将其输入到模型类中,或者,如果找到,是否有另一种方法使Phalcon自动使用默认值?我认为,最好的方法是忽略未设置的字段。我可以让模型这样做吗?

在特定插入中,可以使用原始数据库值来避免这种情况:

<?php

use Phalcon\Db\RawValue;

$product = new Products();
$product->setName('someName');
$product->setType(new RawValue('default')); //use default here
$product->save();
或者在生成的每个SQL插入中忽略以下字段:

use Phalcon\Db\RawValue;

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

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

我会在声明属性时设置默认值,并将逻辑保留在应用程序层中。但那只是我。

像下面这样使用

SkipPattPropertiesOnCreate将确保Phalcon不会尝试在该列中输入a值。数据库将应用默认值

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

“正确的”体系结构方法不是在DB级别强制执行这样的默认值吗?至少这样你永远不会得到坏数据。@twistedxtra微小的改进:
$this->type=$this->type?:新的RawValue('default')。但无论如何——谢谢!:)嗨,德基,欢迎来到StackOverflow。在这里回答问题时,您应该始终提供解释和说明,以帮助解决手头的问题。发布一段代码通常没有帮助,也不提供上下文。请考虑更新您的答案。
public function initialize()
{
    $this->setSource('table_name');
    $this->skipAttributesOnCreate(['name_of_column']);
}