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

问题描述 投票:0回答:3

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

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);

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

这是怎么做的?

php laravel laravel-5 eloquent
3个回答
6
投票

Laravel/Eloquent 对数据库的结构一无所知。假设无论您执行什么操作,数据库结构都已准备好。

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

show columns from <table_name>;

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

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

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

以类似的方式存储
$fillable

$guarded 字段。当您编写模型时,您应该知道哪些列是nullable,哪些不是,所以这应该是最简单的解决方案。


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

2
投票
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)

对于 PostgreSQL,我更新了 Sole.dmitry 的答案并创建了一个函数,可以在给定的模型上执行。对于前。模型 User,然后在实例上 $user->getNullableFields() 会将它们作为可为空的字段名称数组返回

0
投票
public function getNullableFields(){ $columns_info = DB::select("SELECT COLUMN_NAME, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '{$this->getTable()}'"); $nullableFields = array_filter($columns_info, function($v) { return $v->is_nullable == 'YES'; }); $nullable_fields = json_decode(json_encode($nullableFields), true); return array_map(function ($fields) { return $fields['column_name']; }, $nullable_fields); }


© www.soinside.com 2019 - 2024. All rights reserved.