2014-09-21 61 views
3

我從數據庫中獲取一個空日期,並轉換爲碳對象在這樣的模型相比...空日期碳對象laravel 4刀模板

protected $dates = array(
    'date', 
} 

然後在控制器I傳遞對象緊湊(「對象」)

但是,當我顯示刀片模板中的$對象 - >日我收到'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" } 

有什麼建議?謝謝

回答

3

你有幾個選擇。您可以在給定的模型中以基礎模型控制它,因此它適用於您的所有模型,或適用於最適合放置的演示者,因爲它屬於表示層。

順便提一下,它不是null而是默認0000-00-00 00:00:00時間戳。價值不會被這樣處理。

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

謝謝爲你的快速反應球員......我試圖擴展基本模型,但不能使用碳方法(addMonths)在另一個突變的碳領域(方法未找到)sa YS。 無論如何,我明白這是一個演示者的邏輯,所以必須在刀片模板中......但最後我使用了mutter getDateAttribute,因爲它沒有與您的返回一起創建並且工作......感謝你們兩位的幫助 – David 2014-09-21 18:50:31

+0

演示者不是一個視圖或模板,它是另一個用於改變你的例子的圖層。用於演示目的的模型。你總是可以使用Carbon,對此沒有任何問題,所以我不知道你的意思。 – 2014-09-21 19:04:52

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

,目前在刀片模板文件,你可以使用:

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

很簡單的答案

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

在處理0000-00-00 00:00:00日期時間時,年轉換爲-1。所以你可以明顯地只顯示任何東西> 0

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年),但對於像創建,更新,禁用時間戳,它的工作原理酒

+1

介意說明一下嗎? – manetsus 2016-01-21 01:10:48

+0

以匿名形式發佈以提高... – 2016-01-22 11:03:50