ホームページ >バックエンド開発 >PHPチュートリアル >Laravel 5 つの基本 (10) - 日付、ミューテーター、スコープ

Laravel 5 つの基本 (10) - 日付、ミューテーター、スコープ

WBOY
WBOYオリジナル
2016-06-13 12:17:18797ブラウズ

Laravel 5 の基本 (10) - 日付、ミューテーター、スコープ

以前の解決策では、published_at に現在の日付を直接割り当てるのは、実際には一時的な解決策ですが、公開日を設定する必要があります。次の 2 日までリリースされるので、この問題を修正しましょう。

最初にコントローラーを変更します:

<code>    public function store() {        Article::create(Request::all());        return redirect(&#39;articles&#39;);    }</code>

次にビューを変更して公開日フィールドを追加します

<code>@extends(&#39;layout&#39;)@section(&#39;content&#39;)    <h1>Write a New Article</h1>    <hr/>    {{--使用我们添加的 illuminate\html 开源库--}}    {!! Form::open([&#39;url&#39; => &#39;articles&#39;]) !!}        <div class="form-group">            {!! Form::label(&#39;title&#39;, &#39;Title:&#39;) !!}            {!! Form::text(&#39;title&#39;, null, [&#39;class&#39; => &#39;form-control&#39;]) !!}        </div>        <div class="form-group">            {!! Form::label(&#39;body&#39;, &#39;Body:&#39;) !!}            {!! Form::textarea(&#39;body&#39;, null, [&#39;class&#39; => &#39;form-control&#39;]) !!}        </div>        <div class="form-group">            {!! Form::label(&#39;published_at&#39;, &#39;Publish On:&#39;) !!}            {!! Form::input(&#39;date&#39;, &#39;published_at&#39;, date(&#39;Y-m-d&#39;), [&#39;class&#39; => &#39;form-control&#39;]) !!}        </div>        <div class="form-group">            {!! Form::submit(&#39;Add Article&#39;, [&#39;class&#39; => &#39;btn btn-primary form-control&#39;]) !!}        </div>    {!! Form::close() !!}@stop</code>

OK、新しい記事を追加して日付を入力しましょう将来の特定の日に設定されていますが、記事が最初に直接表示されますが、これは必要なものではありません。当日にそれを見せなければなりません。もちろん、0時ではなく朝8時に表示するなど、より具体的にする必要があります。ミューテーター (つまり、他の言語の属性セッター) を追加し、モデル

<code><?php namespace App;use DateTime;use Illuminate\Database\Eloquent\Model;class Article extends Model {	protected $fillable = [        &#39;title&#39;,        &#39;body&#39;,        &#39;published_at&#39;    ];    //属性设置其要遵守格式约定    // set属性Attribute    public function setPublishedAtAttribute($date) {        $this->attributes[&#39;published_at&#39;] = Carbon::createFromFormat(&#39;Y-m-d&#39;, $date)->hour(8)->minute(0)->second(0);    }}</code>

を変更し、新しいレコードを追加して、データベースを確認できます。時刻は正しく設定されていますが、ホームページは異なります。今後の投稿が公開される前に引き続き表示され、変更されます。

<code>	public function index() {        //$articles = Article::latest(&#39;published_at&#39;)->get();        $articles = Article::latest(&#39;published_at&#39;)->where(&#39;published_at&#39;, &#39;<=&#39;, Carbon::now())->get();        return view(&#39;articles.index&#39;, compact(&#39;articles&#39;));    }</code>

上記の解決策は機能しますが、クエリ ステートメントが長すぎます。 Laravel が提供するスコープを使用すると、作業を簡素化できます。いわゆるスコープは、クエリ プロセスで使用される中間クエリ結果として理解できます。たとえば、公開されたスコープを定義すると、現在公開されているすべての記事が返され、モデルを変更できるようになります。

<code>    //设置scope,遵守命名规则    public function scopePublished($query) {        $query->where(&#39;published_at&#39;, &#39;<=&#39;, Carbon::now());    }</code>

スコープを使用するようにコントローラーを変更します

<code>	public function index() {        //$articles = Article::latest(&#39;published_at&#39;)->get();        //$articles = Article::latest(&#39;published_at&#39;)->where(&#39;published_at&#39;, &#39;<=&#39;, Carbon::now())->get();        $articles = Article::latest(&#39;published_at&#39;)->published()->get();        return view(&#39;articles.index&#39;, compact(&#39;articles&#39;));    }</code>

結果は同じですが、複雑なクエリではスコープを使用してタスクを分解したり、クエリを再利用したりできます。

まだ公開されていないすべての記事をクエリする新しいクエリを追加しましょう。スコープ

<code>    public function scopeUnpublished($query) {        $query->where(&#39;published_at&#39;, &#39;>&#39;, Carbon::now());    }</code>

をモデルに追加し、unpulished

<code>	public function index() {        //$articles = Article::latest(&#39;published_at&#39;)->get();        //$articles = Article::latest(&#39;published_at&#39;)->where(&#39;published_at&#39;, &#39;<=&#39;, Carbon::now())->get();        //$articles = Article::latest(&#39;published_at&#39;)->published()->get();        $articles = Article::latest(&#39;published_at&#39;)->Unpublished()->get();        return view(&#39;articles.index&#39;, compact(&#39;articles&#39;));    }</code>

を使用するようにコントローラーを変更します。show メソッドで dd($article->published_at) を使用して結果を表示するとします。 、dd($article->created_at); の場合、結果は異なります。前者では独自のフィールドを作成しますが、後者では、CreateArticleTable$table->timestamp() によって自動的に生成されます。自動生成されたフィールドは Carbon タイプとして表示されますが、私たちのフィールドは文字列です。たとえば、Crabon 型を使用すると、dd($article->created_at->diffForHumans()); とこの 1 hour ago の結果を出力できますが、published_at は出力できません。変更するにはどうすればよいですか?モデルを変更し、laravel に published_at が日付であることを伝えます。

<code>    protected $dates = [&#39;published_at&#39;];</code>

もう一度 dd($article->published_at->diffForHumans()); を使用すると、結果は 3 days from now と表示され、ビンゴ!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:8. 参考:次の記事:8. 参考: