Laravel 5フレームワーク学習の日付、MutatorとScope

5012 ワード

我々の前のソリューションではpublished_に直接atは現在の日付に値を割り当てるのは実際には一時的な解決策であり、リリース日を設定する必要があります.今後2日後にリリースされる可能性があります.この問題を修正しましょう.
まずコントローラを変更します.

  public function store() {
    Article::create(Request::all());
    return redirect('articles');
  }

次にビューを変更し、パブリッシュ日フィールドを追加します.

@extends('layout')

@section('content')
  

Write a New Article


{{-- illuminate\html --}} {!! Form::open(['url' => 'articles']) !!}
{!! Form::label('title', 'Title:') !!} {!! Form::text('title', null, ['class' => 'form-control']) !!}
{!! Form::label('body', 'Body:') !!} {!! Form::textarea('body', null, ['class' => 'form-control']) !!}
{!! Form::label('published_at', 'Publish On:') !!} {!! Form::input('date', 'published_at', date('Y-m-d'), ['class' => 'form-control']) !!}
{!! Form::submit('Add Article', ['class' => 'btn btn-primary form-control']) !!}
{!! Form::close() !!} @stop

OK、新しい文章を追加して、日付を未来のある日に設定しましょう.しかし、文章は最初に表示されます.これは私たちが必要としないものです.私たちはその日になってから表示する必要があります.もちろん、0時ではなく朝8:00に表示するなど、より具体的な点が必要です.mutator(つまり他の言語のプロパティ設定器)を追加してmodelを変更することができます.

attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date)->hour(8)->minute(0)->second(0);
  }

}


新しいレコードを追加して、データベースを表示して、私たちはすでに時間を正しく設定しましたが、私たちのトップページには未来のリリースされた文章が表示されています.私たちはそれを修正します.

 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'));
  }


上記の解決策は動作しますが、クエリー文が長すぎます.Laravelが提供するscopeを使用して、私たちの仕事を簡素化することができます.scopeとは、published scopeを定義するなど、クエリー中に使用される中間クエリーの結果と理解できます.彼は現在公開されているすべての文章を返して、モデルを変更することができます.

  //  scope,      
  public function scopePublished($query) {
    $query->where('published_at', '<=', Carbon::now());
  }

コントローラの変更scopeの使用

 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'));
  }


結果は同じですが、複雑なクエリーではscopeを使用してタスクを分解したり、クエリーを多重化したりすることができます.
まだ公開されていないすべての文章をクエリーする新しいクエリーを追加します.モデルにscopeを追加するには

  public function scopeUnpublished($query) {
    $query->where('published_at', '>', Carbon::now());
  }

コントローラの変更unpulishedの使用

 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'));
  }


one more thing! 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は日付でいいです.

  protected $dates = ['published_at'];

dd($article->published_at->diffForHumans())、結果は3 days from now,Bingo!
以上が本文のすべてですが、Laravel 5のフレームワークを学ぶのに役立つことを願っています.