2016-04-14 7 views
1

In meinem Modell I Funktionen und Zeitattribute wie soWie alle Zeit außer Kraft zu setzen Attribute

public function setEndTimeAttribute($value) 
    { 
    return $this->attributes['end_time'] = date("H:i", strtotime($value)); 
    } 
    public function getEndTimeAttribute($value) 
    { 
    return date("h:i a", strtotime($value)); 
    } 
    public function setStartTimeAttribute($value) 
    { 
    return $this->attributes['start_time'] = date("H:i", strtotime($value)); 
    } 
    public function getStartTimeAttribute($value) 
    { 
    return date("h:i a", strtotime($value)); 
    } 

ich diese erhalten setzen tue, weil MySQL das Format eine bestimmte Art und Weise erfordert, und ich möchte, um sie anzuzeigen, um meine Benutzer in einem anderen Format. Ich werde dies für alle meine Zeiteingaben tun müssen.

Ich kann weiterhin diese Get/Set-Funktionen für jedes Attribut in meinem Modell machen, aber ich hoffe, dass jemand mir einen besseren Weg zeigen kann, wo ich es nur einmal tun muss. Scheint mir so, als würde ich es falsch machen, so wie ich es mache.

Antwort

2

Sie berücksichtigen sollten

In Ihrem Modell aus der Box mit Laravel versehen Vorteil der ausgezeichneten Carbon Paket nehmen, fügen Sie ein beliebiges Feld Sie als Carbon-Instanz an die $dates Array zurückgegeben werden soll:

protected $dates = ['created_at', 'updated_at', 'custom_field']; 

Nun, wenn Sie Ihr Modell aufrufen wird es automatisch eine Carbon-Instanz zurückgeben und ermöglicht es Ihnen, Dinge wie:

// In your controller 
... 
$user = App\User::find($id); 

return view('user', compact('user')); 
... 

// Then in your view 
<p> Joined {{ $user->created_at->diffForHumans(); }} </p> 

// output 
Joined 8 days ago 
1

Es gibt keine einfache Möglichkeit, Zugriffsmodule auf mehrere Felder zu gruppieren. Laravel ruft sie beim Zugriff auf sie auf, dies geschieht auf einer Attributbasis entweder durch Abrufen oder Setzen.

Wenn Sie jedoch viele dieser Attribute mit ähnlichen Namen (start_time, end_time) in Ihren Modellen haben, sollten Sie die Verwendung eines Merkmals in Betracht ziehen. Auf diese Weise müssen Sie nur das Merkmal in Ihrem Modell verwenden und Sie können Ihre gesamte Logik an einem Ort behalten.

Beispiel:

use Carbon\Carbon; 

trait TimeFieldsTrait 
{ 
    public function formatDisplayTime($value) 
    { 
     return Carbon::parse($value)->format('h:i a'); 
    } 

    public function formatDbTime($value) 
    { 
     return Carbon::parse($value)->format('H:i'); 
    } 

    public function setEndTimeAttribute($value) 
    { 
     return $this->attributes['end_time'] = $this->formatDbTime($value); 
    } 

    public function getEndTimeAttribute($value) 
    { 
     return $this->formatDisplayTime($value); 
    } 

    public function setStartTimeAttribute($value) 
    { 
     return $this->attributes['start_time'] = $this->formatDbTime($value); 
    } 

    public function getStartTimeAttribute($value) 
    { 
     return $this->formatDisplayTime($value); 
    } 
} 

Und in Ihrem Modell würden Sie gerade dieses Merkmal verwenden ...

class YourModel extends Model 
{ 
    use TimeFieldsTrait; 
} 
Verwandte Themen