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

5
如果表中某些字段有默认值且不允许为NULL,那么我们期望插入脚本使用这些默认值,就像MariaDB/MySQL通常所做的那样。例如,如果表格products有一个AI字段“id”,一个必需的字段“name”和两个必需的字段“active”和“featured”,它们都默认为1,则查询应该是:
INSERT INTO products (name) VALUES ('someName');

自动将1插入为活动和精选的值。然而,当使用Phalcon的模型时,请按以下方式操作:

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

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

在生成模型时,我需要提供标志吗,以便Phalcon工具收集并输入默认值到模型类中,或者还有其他方法让Phalcon自动使用找到的默认值?最好的方法应该是忽略未设置的字段。我能让模型这样做吗?

3个回答

9
你可以在特定的插入操作中使用原始数据库值来避免这种情况:
<?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 INSERT生成中忽略这些字段:

use Phalcon\Db\RawValue;

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

@twistedxtra 小改进:$this->type = $this->type ?: new RawValue('default');。但无论如何 - 谢谢! :) - serghei

2
虽然我觉得twistedxtra的答案很有趣,因为Phalcon包含了这种读取列默认值的方法,但是从架构的角度来看,我认为这可能是错误的方法,因为你依赖于数据库来定义模型属性的默认值。我会在声明属性时设置默认值,并将逻辑保留在应用层。但这只是我的看法。

“正确”的架构方法不是在数据库层面强制执行这样的默认设置吗?至少这样做,您永远不会遇到坏数据的情况。 - Big McLargeHuge

1

使用如下方式

skipAttributesOnCreate 将确保 Phalcon 不会尝试将值放入该列。数据库将应用默认值。

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

1
嗨,Deji,欢迎来到StackOverflow。在这里回答问题时,您应该始终提供解释和描述以帮助解决手头的问题。发布一段代码块通常没有帮助,并且它不提供上下文。请考虑更新您在此处的答案。 - Sam Spencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接