【问题标题】:Eloquent default attribute values: $attributes or DB column default value?雄辩的默认属性值:$attributes 还是 DB 列默认值?
【发布时间】:2017-05-17 23:34:29
【问题描述】:

为 Eloquent 模型实现默认值的正确方法是什么?

我已经使用 Laravel 的迁移配置了我的数据库表。某些列已指定默认值。当将这些表与 Eloquent 模型结合使用时,会发生不同的事情,具体取决于所选的数据库驱动程序:

在 MySQL 中,当创建一个新模型并保存它时,会插入一个 DB 行,该行具有每个未明确指定的属性的列默认值。 这就是我希望发生的事情。

然而,在 Postgres 和 SQLite 中,情况并非如此。抛出 PDOException:

[PDO异常]
SQLSTATE [23502]:非空违规:7 错误:列中的空值 “some_column”违反了非空约束
详细信息:失败行包含 (1, 2, 3, 4, 5, 6, null, null, null, null, null, null, 7, 8, null, 9, null, null, 10, 11, 12, null) .

我很清楚,该列不可为空,并且不接受空值。但是,我希望插入默认值而不是引发错误。

【问题讨论】:

  • 迁移中的变量是哪种数据类型??
  • @lewis4u 这是一个tinyInteger

标签: postgresql laravel eloquent doctrine


【解决方案1】:

SQL NOT NULL 约束

NOT NULL 约束强制列不接受 NULL 值。

您在 NOT NULL 列上添加一个空值

好像

http://www.w3schools.com/sql/sql_notnull.asp

【讨论】:

  • 好的,有趣的是,这在 MySQL 中确实有效。尽管如此,问题仍然是在 Eloquent 中实现默认值的正确方法是什么。
【解决方案2】:

我建议您创建自己的父模型,直接扩展 Eloquent,并让您的所有模型都扩展此自定义父模型。

在自定义父级中,重写 performInsert() 方法以在插入之前删除 null 值。请务必从 Eloquent 源代码中复制整个方法,以免丢失过程中的任何重要步骤:

class MyModelParent extends Illuminate\Database\Eloquent\Model
{
    /**
     * Perform a model insert operation.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return bool
     */
    protected function performInsert(Builder $query)
    {
        if ($this->fireModelEvent('creating') === false) {
            return false;
        }

        ... // Be sure to copy all of it!

        // This is the change you'll make. Before, it was just:
        // $attributes = $this->attributes;
        $attributes = array_filter($this->attributes, function($val){
            return $val !== null;
        });

        ... // Be sure to copy all of it!

        return true;
    }
}

performUpdate() 应该可以很好地处理这个问题,因为它使用getDirty() 来获取字段列表,而不是直接访问属性。

当你这样做的时候,你应该考虑向 Laravel 提交一个补丁,这将使核心 Postgres 安全。

【讨论】:

  • 感谢您的回复。剩下的问题是:为 Eloquent 模型实现默认值的首选方法是什么?这尤其适用于布尔值和“枚举”(只是模型中定义的整数常量)。
  • @TomLank。此解决方案应生成忽略空值的 INPUT 语句,让数据库处理默认值。您不必担心模型中的默认值。
  • 我会测试一下。泰。
猜你喜欢
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2023-03-18
  • 2011-12-16
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多