我有一个包含一些日期类型输入的表单:
<input name="some_date" type="date" />
这些字段不是必需的,可以保持不变,因此some_date
字段设置为&#34; nullable&#34;在数据库中。以下是plugins/acme/plugin/updates/
中迁移文件的行:
$table->date('some_date')->nullable();
问题在于,当我尝试使用Eloquent的fill()
方法和OctoberCMS的post()
帮助程序保存表单数据时,我得到SQL告诉我我有一个&# 34;日期值不正确:&#39;&#39;&#34;。
$object = new SomeObject();
$object->fill(post());
$object->save();
当然,我知道空字符串是一种无效的格式,但是不应该这样做吗? post()
不应该照顾这个吗?或者是否需要传入额外的设置/ var?
否则我只需要遍历post()
并自己处理空蜇。有点乱。
答案 0 :(得分:1)
第二个想法,使用array_filter()
不是一个好主意。
如果您的模型具有像is_active = false
这样的虚假值的属性,该怎么办?
$data = post();
if(is_array($data) && count($data)){
$data = array_filter($data);
$object = new SomeObject();
$object->fill($data);
$object->save();
}
// $data = [
// 'some_date' => '' // false
// 'is_active' => false // Will be filtered out
// ];
我能想到的方式;
使用模型中的Nullable Trait:
class MyModel extends Model
{
use \October\Rain\Database\Traits\Nullable;
protected $nullable = ['some_date'];
}
现在,如果some_date = ''
,它将无效。
或强>
使用beforeValidate()
,beforeSave()
模型事件并检查some_date
是否为空字符串并手动将其设置为NULL
public function beforeValidate()
{
if(empty($this->some_date)){
$this->some_date = null;
}
}
或
在模型中定义Mutator方法并操纵属性的值:
protected $dates = ['some_date'];
public function setSomeDateAttribute($value)
{
if(empty($value)){
$this->attributes['some_date'] = null;
} else {
$this->attributes['some_date'] = $value;
}
}