比较laravel 4刀片模板中的null date carbon对象

时间:2014-09-21 12:46:00

标签: date laravel laravel-4 eloquent

我从数据库中得到一个空日期,并在模型中转换为碳对象......

protected $dates = array(
  'date',
}

然后在控制器中我使用compact(' object')

传递对象

但是当我在刀片模板中显示$ object->日期时,我会得到' 30-11--0001'我想显示'无'

我试过了

@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" }

有什么建议吗?感谢

4 个答案:

答案 0 :(得分:3)

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

请注意,它不是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个常规解决方案 - 覆盖asDateTime上的BaseModel(假设您使用了一个):

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';
}

答案 1 :(得分:1)

问题在于,实际上数据库中的日期不是空的,而是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

答案 2 :(得分:1)

嗯,如果你有日期>这个比较可能会很好。比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;

它可能不适合出生日期(< 1970),但对于创建,更新,禁用等时间戳,它可以起作用。

答案 3 :(得分:0)

非常简单的回答

@if (isset($timestamp->date) && $timestamp->date->year > 1990)
    {{ $timestamp->date->format('m/d/Y') }}
@endif
当处理00:00:00日期时间时,

年转换为-1。所以你显然可以让它显示任何> 0