保存时,我将所有空字段设置为null
使用OctoberCMS模型事件beforeSave
(相当于Laravel模型保存)
public function beforeSave()
{
// $this => the model
foreach ( $this->toArray() as $name => $value )
{
if ( empty( $value ) ) {
$this->{$name} = null;
}
}
}
问题是当字段具有在数据库(mysql)上定义的默认值时,例如:
$table->integer('value')->default(1);
我需要获取当前模型的所有可空或不可空字段的数组。
这是怎么做到的?
答案 0 :(得分:5)
Laravel / Eloquent 对数据库的结构一无所知。假设您实施的任何操作都为数据库结构做好了准备。
您可以查询数据库以获取有关列的信息。对于 MySQL ,您需要运行
show columns from <table_name>;
这将导致其他查询发送到数据库。
在我看来,更好的选项就是将这些信息存储在模型类中,例如在
protected $notNullable = ['field1', 'field2'];
以类似的方式存储 $ fillable 或 $ guarded 字段。在编写模型时,您应该知道哪些列是nullable
而哪些不是,因此它应该是最简单的解决方案。
答案 1 :(得分:0)
将此添加到模型或特征
use DB;
...
protected static $_columns_info = NULL;
protected static $_nullable_fields = NULL;
public function is_nullable(string $field_name){
if (is_null(static::$_columns_info) ){
static::$_columns_info = DB::select('show columns from '.$this->gettable() );
}
if (is_null(static::$_nullable_fields) ){
static::$_nullable_fields = array_map( function ($fld){return $fld->Field;}, array_filter(static::$_columns_info,function($v){return $v->Null=='YES';}));
}
return in_array( $field_name, static::$_nullable_fields );
}
并使用
app(Model::class)->is_nullable(you_column_name)