5

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

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

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

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

返回验证错误,说“活动”和“特色”是必需的。

在模型生成期间我应该提供一个标志,以便 Phalcon 工具收集默认值并将其输入到模型类中,还是另一种方式让 Phalcon 在找到时自动使用默认值?我认为最好的方法是忽略未设置的字段。我可以让模型这样做吗?

4

3 回答 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'));
    }
}
于 2013-04-11T15:33:30.337 回答
2

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

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

于 2013-07-18T10:22:22.250 回答
1

使用如下

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

public function initialize()
{
    $this->setSource('table_name');
    $this->skipAttributesOnCreate(['name_of_column']);
}
于 2016-10-18T16:58:10.943 回答