为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)
我很清楚该列不可为空,并且不接受空值。但是我希望插入默认值而不是引发错误。
答案 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列上添加空值
似乎