我从数据库中得到一个空日期,并在模型中转换为碳对象......
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" }
有什么建议吗?感谢
答案 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