In unserer vorherigen Lösung ist die direkte Zuweisung von „publicated_at“ tatsächlich eine vorübergehende Lösung. Wir müssen das Veröffentlichungsdatum festlegen, das möglicherweise erst 2 Tage in der Zukunft veröffentlicht wird.
Ändern Sie zuerst den Controller:
<code> public function store() { Article::create(Request::all()); return redirect('articles'); }</code>
Ändern Sie dann die Ansicht und fügen Sie das Feld für das Veröffentlichungsdatum hinzu
<code>@extends('layout') @section('content') <h1>Write a New Article</h1> <hr/> {{--使用我们添加的 illuminate\html 开源库--}} {!! Form::open(['url' => 'articles']) !!} <div class="form-group"> {!! Form::label('title', 'Title:') !!} {!! Form::text('title', null, ['class' => 'form-control']) !!} </div> <div class="form-group"> {!! Form::label('body', 'Body:') !!} {!! Form::textarea('body', null, ['class' => 'form-control']) !!} </div> <div class="form-group"> {!! Form::label('published_at', 'Publish On:') !!} {!! Form::input('date', 'published_at', date('Y-m-d'), ['class' => 'form-control']) !!} </div> <div class="form-group"> {!! Form::submit('Add Article', ['class' => 'btn btn-primary form-control']) !!} </div> {!! Form::close() !!} @stop</code>
OK, fügen wir einen neuen Artikel hinzu und legen das Datum auf einen Tag in der Zukunft fest, aber der Artikel wird direkt am Anfang angezeigt, was wir nicht brauchen. Wir müssen es an diesem Tag zeigen. Natürlich müssen wir konkreter sein, z. B. die Anzeige um 8:00 Uhr morgens statt um 0 Uhr. Wir können einen Mutator (d. h. einen Eigenschaftssetzer in anderen Sprachen) hinzufügen und unser Modell ändern
<code><?php namespace App; use DateTime; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected $fillable = [ 'title', 'body', 'published_at' ]; //属性设置其要遵守格式约定 // set属性Attribute public function setPublishedAtAttribute($date) { $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date)->hour(8)->minute(0)->second(0); } }</code>
Fügen Sie einen neuen Datensatz hinzu, überprüfen Sie die Datenbank, wir haben die Zeit richtig eingestellt, aber auf unserer Homepage werden weiterhin die in Zukunft veröffentlichten Artikel angezeigt, wir ändern sie.
<code> public function index() { //$articles = Article::latest('published_at')->get(); $articles = Article::latest('published_at')->where('published_at', '<=', Carbon::now())->get(); return view('articles.index', compact('articles')); }</code>
Die obige Lösung funktioniert, aber die Abfrageanweisung ist zu lang. Wir können den von Laravel bereitgestellten Spielraum nutzen, um unsere Arbeit zu vereinfachen. Der sogenannte Bereich kann als Zwischenabfrageergebnis verstanden werden, das im Abfrageprozess verwendet wird. Wenn wir beispielsweise einen veröffentlichten Bereich definieren, kann dieser alle aktuell veröffentlichten Artikel zurückgeben, sodass wir das Modell ändern können.
<code> //设置scope,遵守命名规则 public function scopePublished($query) { $query->where('published_at', '<=', Carbon::now()); }</code>
Ändern Sie den Controller, um den Bereich zu verwenden
<code> public function index() { //$articles = Article::latest('published_at')->get(); //$articles = Article::latest('published_at')->where('published_at', '<=', Carbon::now())->get(); $articles = Article::latest('published_at')->published()->get(); return view('articles.index', compact('articles')); }</code>
Das Ergebnis ist das gleiche, aber bei komplexen Abfragen können wir den Bereich nutzen, um unsere Aufgaben aufzuschlüsseln oder Abfragen wiederzuverwenden.
Fügen wir eine neue Abfrage hinzu, um alle Artikel abzufragen, die noch nicht veröffentlicht wurden. Fügen Sie dem Modell einen Bereich
hinzu<code> public function scopeUnpublished($query) { $query->where('published_at', '>', Carbon::now()); }</code>
Ändern Sie den Controller so, dass er unpulished verwendet
<code> public function index() { //$articles = Article::latest('published_at')->get(); //$articles = Article::latest('published_at')->where('published_at', '<=', Carbon::now())->get(); //$articles = Article::latest('published_at')->published()->get(); $articles = Article::latest('published_at')->Unpublished()->get(); return view('articles.index', compact('articles')); }</code>
Noch etwas! Wenn wir show
in der dd($article->published_at)
-Methode verwenden, unterscheidet sich das angezeigte Ergebnis vom dd($article->created_at);
-Ergebnis. Bei ersterem erstellen wir unsere eigenen Felder und bei letzterem übergeben wir CreateArticleTable > Automatisch generiert. Das automatisch generierte Feld wird als Typ $table->timestamp()
angezeigt, während unseres ein String ist. Die Verwendung des Crabon-Typs bietet viele Vorteile. Sie können beispielsweise Carbon
und dieses dd($article->created_at->diffForHumans());
-Ergebnis ausgeben, unser 1 hour ago
jedoch nicht. Wie kann ich es ändern? Ändern Sie das Modell und teilen Sie Laravel mit, dass published_at
das Datum ist. published_at
<code> protected $dates = ['published_at'];</code>
erneut und das Ergebnis wird als dd($article->published_at->diffForHumans());
, Bingo, angezeigt! 3 days from now