Eloquent默认属性值:$ attributes或DB列默认值?

时间:2017-01-03 19:27:14

标签: postgresql laravel eloquent doctrine

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

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

在MySQL中,在创建新模型并保存它时,会插入一个数据库行,其中列的默认值为未明确指定的每个属性。 这就是我想要发生的事情。

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

  

[PDOException]
  SQLSTATE [23502]:非空违规:7错误:列中的空值   " some_column"违反非空约束
  DETAIL:失败的行包含(1,2,3,4,5,6,null,null,null,null,null,null,7,8,null,9,null,null,10,11,12,null)

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

2 个答案:

答案 0 :(得分:1)

我建议您创建自己的父模型,直接扩展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安全。

答案 1 :(得分:0)

SQL NOT NULL约束

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

您在NOT NULL列上添加空值

似乎

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