【问题标题】:Comparing null date carbon object in laravel 4 blade templates比较 laravel 4 刀片模板中的空日期碳对象
【发布时间】:2016-01-22 18:52:13
【问题描述】:

我从数据库中获取一个空日期并像这样在模型中转换为碳对象...

protected $dates = array(
  'date',
}

然后在控制器中我用 compact('object') 传递对象

但是当我在刀片模板中显示 $object->date 时,我得到 '30-11--0001' 并且我想显示 'None'

我试过了

@if ($object->date !== '30-11--0001') $object->date else 'None' @endif

没有用

@if (date('d-m-Y',strtotime($object->date)) !== '30-11--0001') $object->date else 'None' @endif

没有用

@if (empty($object->date)) $object->date else 'None' @endif

没有用

如果我执行 var_dump 我会得到

class Carbon\Carbon#491 (3) { public $date => string(27) "-0001-11-30 00:00:00.000000" public $timezone_type => int(3) public $timezone => string(13) "Europe/Madrid" }

有什么建议吗?谢谢

【问题讨论】:

    标签: date laravel laravel-4 eloquent


    【解决方案1】:

    您有几个选择。您可以在给定模型中控制它,在基础模型中,因此它适用于您的所有模型,或者在最合适的地方的演示器中,因为它属于表示层。

    顺便说一句,它不是null,而是默认的0000-00-00 00:00:00 时间戳。 null 值不会被这样处理。

    1 最短解决方案 - 模型:

    public function getCreatedAtAttribute($timestamp)
    {
        // flexible:
        return ( ! starts_with($timestamp, '0000')) ? $this->asDateTime($timestamp) : 'None';
        // or explicit:
        // return ($timestamp !== '0000-00-00 00:00:00') ? $this->asDateTime($timestamp) : 'None';
    }
    

    2 通用解决方案 - 在您的 BaseModel 上覆盖 asDateTime(假设您使用一个):

    protected function asDateTime($value)
    {
        if (starts_with($value, '0000')) return 'None';
    
        return parent::asDateTime($value);
    }
    

    这将影响您希望被突变为Carbon的所有属性。

    3 个演示者(我假设它只是包装了model,实现取决于您的需要):

    public function createdAt()
    {
        $timestamp = $this->model->created_at;
    
        return ( ! starts_with($timestamp, '-')) ? $timestamp : 'None';
    }
    

    【讨论】:

    • 感谢你们的快速响应...我试图扩展基本模型,但不能在另一个变异的 Carbon 字段(未找到方法)上使用 Carbon 方法(addMonths)。无论如何,我知道这是一个演示者逻辑,所以必须在刀片模板中......但最后我使用了 mutator getDateAttribute,因为在您的返回和工作中没有 CreatedAt......谢谢你们的帮助跨度>
    • Presenter 不是视图或模板,它是用于改变您的例如的另一层。用于演示目的的模型。您始终可以使用 Carbon,这没问题,所以我不知道您的意思。
    【解决方案2】:

    问题是实际上数据库中的日期不是空的,而是0000-00-00 00:00:00,Laravel 将其转换为-0001-11-30 00:00:00

    在这种情况下,您可以使用 accessor - 在您的课程中您可以添加:

    public function getCreatedAtAttribute($value)
    {
        $dt = new DateTime($value);
        if (substr($dt->format('Y'),0,1) == '-') {
            return null;
        }
        return $value;
    }
    

    更改日期的值。如果年份的第一个字符是-,您可以简单比较,如果是,您可以返回null

    现在您可以在 Blade 模板文件中使用:

    @if (is_null($object->created_at))
    None
    @else
    {{ $object->created_at }}
    @endif
    

    【讨论】:

      【解决方案3】:

      好吧,如果您的日期大于 1970,这种比较可能会很好,因为 strtotime 将格式为“yyyy-mm-dd hh:mi”的字符串转换为 datetime 类型(自 1970 年 1 月 1 日以来经过的秒数:

      $dateInvalid = "0000-00-00 00:00:00";
      $dateInvalid2 = "1969-12-31 23:59:59";
      $dateValid = "1970-01-01 00:00:00";
      $dateValid2 = "2016-22-01 12:00:00";
      
      return strtotime($anyDate) >= 0;
      

      它可能不适合出生日期(

      【讨论】:

        【解决方案4】:

        很简单的答案

        @if (isset($timestamp->date) && $timestamp->date->year > 1990)
            {{ $timestamp->date->format('m/d/Y') }}
        @endif
        

        year 在处理 0000-00-00 00:00:00 日期时间时转换为 -1。所以你显然可以让它显示任何 > 0

        【讨论】:

          猜你喜欢
          • 2016-08-09
          • 2017-07-17
          • 1970-01-01
          • 2018-08-05
          • 1970-01-01
          • 1970-01-01
          • 2013-06-03
          • 2016-05-11
          • 2013-05-08
          相关资源
          最近更新 更多