如何使模型在Phalcon PHP框架中使用默认值?
如果一个表在某些字段上有默认值,并且不允许NULL,那么可以期望insert脚本使用这些默认值,就像MariaDB/MySQL通常所做的那样。例如,如果表产品有一个AI字段“id”、一个必填字段“name”和两个必填字段“active”和“featured”,它们都默认为1,则查询如何使模型在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
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']);
}