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


How to make models use defaults in Phalcon PHP Framework?

如果一个表在某些字段上有默认值,并且不允许NULL,那么插入脚本将使用这些默认值,就像MariaDB/MySQL通常所做的那样。例如,如果表products有一个AI字段"id",一个必填字段"name"和两个必填字段"active"answers"featured",这两个字段的默认值都是1,那么查询

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

自动插入1作为active和featured的值。然而,当像这样使用Phalcon的模型时:

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

返回验证错误,表示需要"active"answers"featured"。

在模型生成过程中,我是否应该提供一个标志,以便Phalcon工具收集并输入默认值到模型类中,或者另一种方法使Phalcon在发现时自动使用默认值?我认为,最好的方法是忽略未设置的字段。我能让模特那样做吗?

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

<?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'));
    }
}

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

我将在声明属性时设置默认值,并将逻辑保留在应用层。

在下面使用Like

skipAttributesOnCreate将确保Phalcon不会尝试在该列中放置一个a值。数据库将应用默认值。

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