Php 窗体模型绑定上的Laravel日期
我使用的是Laravel 5.1 我有一个模型:Php 窗体模型绑定上的Laravel日期,php,laravel,eloquent,laravel-5.1,Php,Laravel,Eloquent,Laravel 5.1,我使用的是Laravel 5.1 我有一个模型: class ExampleModel extends Model { // .... protected $dateFormat = 'Y.m.d'; protected $dates = ['first_date', 'second_date']; // ... } 因此,当我为ExampleModel元素编制索引时,日期格式是正确的(例如2015.07.31) 但在编辑表单上,它使用默认格式:2015-0
class ExampleModel extends Model {
// ....
protected $dateFormat = 'Y.m.d';
protected $dates = ['first_date', 'second_date'];
// ...
}
因此,当我为ExampleModel元素编制索引时,日期格式是正确的(例如2015.07.31)
但在编辑表单上,它使用默认格式:2015-07-31 00:00:00
我正在使用Form::model()
绑定
我知道我可以使用getFirstDateAttribute()
,但这不是我想要的解决方案。因为它一点也不优雅,而且一旦我定义了$dates
数组,它在任何情况下都会自动工作
那么它可能是一只虫子吗?还是我做错了什么?我以前从未做过这件事,但它似乎适用于我组合的一个基本示例。注意,我只是在表单开始标记中对模型调用
toArray
方法
{!! Form::model($exampleModel->toArray(), ['route' => ['example-models.update', $exampleModel->id]]) !!}
{!! Form::label('first_date', 'First Date') !!}
{!! Form::text('first_date') !!}
{!! Form::close() !!}
文档中说,
dateFormat
属性决定了将对象转换为json或数组时的日期格式。我通过覆盖Carbon的默认日期格式解决了我的问题:
Carbon\Carbon::setToStringFormat('Y.m.d');
但是凯利的答案更好,也更优雅,我也只是发布了这一条,也许有人会发现这一条很有用 我不完全建议将此作为修复,因为当您更新core时,您将丢失此修复,但可能这应该作为拉拽请求发布到Laravel的下一个版本
在\illumb\Database\elount\Concerns\HasAttributes中,按如下方式更新asDate函数。从注释中可以看到,asDate函数仍然返回时间戳,即使它是00:00:00
/**
* Return a timestamp as DateTime object with time set to 00:00:00.
*
* @param mixed $value
* @return \Illuminate\Support\Carbon
*/
protected function asDate($value)
{
$date = $this->asDateTime($value)->startOfDay();
$date->setToStringFormat($this->getDateFormat());
return $date;
}
这允许您从模型中控制日期的格式(注意,我在区分日期和日期时间)。然后使用casts变量将变量转换为日期格式
protected $casts = [
'start_date' => 'date',
'end_date' => 'date'
];
protected $dateFormat = 'Y-m-d';
$dates变量无法区分日期和日期时间
更新
真正的问题是表单模型绑定跳过了FormBuilder类的helper函数。如您所见,如果您检查\collection\Html\FormBuilder::date
/**
* Create a date input field.
*
* @param string $name
* @param string $value
* @param array $options
*
* @return \Illuminate\Support\HtmlString
*/
public function date($name, $value = null, $options = [])
{
if ($value instanceof DateTime) {
$value = $value->format('Y-m-d');
}
return $this->input('date', $name, $value, $options);
}
它正确地将日期格式化为HTML5规范中指定的“Y-m-d”。但是此时$value实际上为空。因此,您必须更新通用输入函数
/**
* Create a form input field.
*
* @param string $type
* @param string $name
* @param string $value
* @param array $options
*
* @return \Illuminate\Support\HtmlString
*/
public function input($type, $name, $value = null, $options = [])
{
...
//$value is null here
if (! in_array($type, $this->skipValueTypes)) {
//$value is fetched based on hierarchy set by
$value = $this->getValueAttribute($name, $value);
//necessary duplicate code to format date value
if ($type == 'date' && $value instanceof DateTime) {
$value = $value->format('Y-m-d');
}
}
...
}
更新无需更新供应商代码。查看FormModelAccessors
但在编辑表单上,它使用默认格式:2015-07-31 00:00:00
显示您选中它的代码查看Illumb\Database\Eloquent\Model
,您应该能够看到$dateFormat
是如何使用的。很好!我在代码中还看到Form::model()
也接受数组,我还发现Array()
的工作方式符合我的要求,我只是不知何故没有将这两条信息放在一起:-)非常感谢!进一步测试。我认为这不是一个有效的答案,因为Carbon的SetToString格式是一个静态变量,会影响所有的碳日期。如果到目前为止您有一个演员阵容,那么所有演员阵容都将到目前为止。看起来最好的方法是将其作为字符串返回,或者作为laravel的日期返回,并且时间为零。也许可以在父类中重写方法,而不是替换供应商代码