Php Laravel:如何检查数据库上的模型字段是否为空

Php Laravel:如何检查数据库上的模型字段是否为空,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,保存时,我将所有空字段设置为null 在保存之前使用OctoberCMS模型事件(相当于Laravel模型保存) 问题在于字段在数据库(mysql)上定义了默认值,例如: $table->integer('value')->default(1); 我需要得到当前模型的所有可为空或不可为空字段的数组 如何做到这一点?Laravel/Eloquent对数据库的结构一无所知。假设无论您实现什么操作,数据库结构都已为它们做好准备 您可以查询数据库以获取有关列的信息。对于MySQL您需要运行

保存时,我将所有空字段设置为
null

在保存之前使用OctoberCMS模型事件
(相当于Laravel模型保存)

问题在于字段在数据库(mysql)上定义了默认值,例如:

$table->integer('value')->default(1);
我需要得到当前模型的所有可为空或不可为空字段的数组


如何做到这一点?

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

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

show columns from <table_name>;

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

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

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)

亲爱的下层选民,请留下评论,我很想知道答案有什么问题:)哦,对不起。为了解决这个问题,我只需设置
protected$notNullables=['foo','bar']
并在循环中创建条件。很好。
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)