【问题标题】:How to make models use defaults in Phalcon PHP Framework?如何使模型在 Phalcon PHP 框架中使用默认值?
【发布时间】:2013-04-03 20:03:19
【问题描述】:

如果一张表在某些字段上有默认值并且不允许使用 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 自动使用默认值(如果找到)?我认为最好的方法是忽略未设置的字段。我可以让模型这样做吗?

【问题讨论】:

    标签: php frameworks phalcon


    【解决方案1】:

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

    <?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-&gt;type = $this-&gt;type ?: new RawValue('default');。但无论如何 - 谢谢! :)
    【解决方案2】:

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

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

    【讨论】:

    • “正确”的架构方法难道不是在数据库级别强制执行这样的默认设置吗?至少这样你就不会得到错误的数据。
    【解决方案3】:

    如下所示使用

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

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

    【讨论】:

    • 嗨,Deji,欢迎来到 StackOverflow。在这里回答问题时,您应该始终提供解释和描述以帮助解决手头的问题。发布一段代码通常没有帮助,而且它没有提供任何上下文。请考虑在此处更新您的答案。
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    相关资源
    最近更新 更多