Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 窗体模型绑定上的Laravel日期_Php_Laravel_Eloquent_Laravel 5.1 - Fatal编程技术网

Php 窗体模型绑定上的Laravel日期

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

我使用的是Laravel 5.1

我有一个模型:

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的日期返回,并且时间为零。也许可以在父类中重写方法,而不是替换供应商代码