繁体   English   中英

Laravel:如何检查模型字段在数据库上是否可以为空

[英]Laravel: How check if model field is nullable on database

保存时我将所有空字段设置为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);

我需要获取当前模型的所有可为空或不可为空的字段的数组。

这怎么办?

Laravel/Eloquent对你的数据库结构一无所知。 假设无论您实施什么操作,数据库结构都已为它们准备就绪。

您可以查询数据库以获取有关列的信息。 对于MySQL,您需要运行

show columns from <table_name>;

这将导致向数据库发送额外的查询

在我看来,更好的选择是将此类信息存储在模型类中,例如

protected $notNullable = ['field1', 'field2'];

以类似的方式存储$fillable$guarded字段。 当您编写模型时,您应该知道哪些列可以为nullable ,哪些不能为nullable ,因此它应该是最简单的解决方案。

将此添加到您的模型或特征中

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM