Laravist は私が立ち上げたばかりの Laravel コミュニティです。Laravel に関する質問がある場合は、ここに来て質問してください。問題を解決するのに最適です。後でいくつかのビデオチュートリアルを録画してみます。形式はおそらく次のとおりです原文は https://laravist.com/article/16 より
https://laravist.com/lesson/1
前のセクションで述べたことに従ってください。 laravelの使用法におけるqueryScopeとsetAttributeについて話しましょう。
アプリケーション シナリオについて
考えてみてください、ユーザーに表示するデータは基本的にデータベースから取得されたものなのでしょうか?この場合、多くのクエリ ステートメントが繰り返されることがよくありますが、コードを記述する行では、基本的に、複数の繰り返しがあると、最適化メソッドが存在します。その場合に、queryScope が登場します。便利です
前に、published_at を記事作成の日付に設定しました:
$input['published_at'] = Carbon::now();
<div class="form-group">{!! Form::label('published_at','发布日期') !!}{!! Form::input('date','published_at',date('Y-m-d'),['class'=>'form-control']) !!}</div>
このコードを追加します textarea の後ろに、Form::input() があります。ここで使用するメソッドは、Form クラスには Form::date() のような日付を指定するメソッドがないため、 Form::input() を使用し、入力の型を date(' として指定します)。 Y-m-d') デフォルト値を記事の公開日として指定しますが、ページがどのように見えるかを見てみましょう:
ここで、フィールドがpublished_atであることがわかります。今回は、ArticleController の store() メソッドのコードを変更できます:
$input = $request->all();$input['intro'] = mb_substr($request->get('content'),0,64);Article::create($input);return redirect('/');
$input['published_at'] = Carbon::now(); のコード行を削除し、作成してみました。記事を見てください:
さて、記事は正常に作成できましたが、データベース内のデータを見ると:
ここでの日付の形式は理想的なパターンではありません。 created_at および updated_at と同じように設定する方法は?時、分、秒ごとにそれを知ることができますか?このとき、setAttribute を使用して完成させます。 Article.php に以下のメソッドを追加します。
public function setPublishedAtAttribute($date){ $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d',$date);}
ここで、set+フィールド名+Attribute という記述メソッドを使用していることに注意してください。その他はキャメルケースメソッドを使用しています。たとえば、パスワードを暗号化したい場合は、次のようにすることができます:
public function setPasswordAttribute($passowrd){ $this->attributes['password'] = Hash::make($passowrd); //仅仅是举例}
ここでは、published_at フィールドも Carbon オブジェクトとして処理したいため、Carbon クラスを使用します。これは、後で非常に役立ちます。 Carbon を導入するには、ファイル ヘッダーで CarbonCarbon を使用することに注意してください。この時点で、もう一度公開しましょう:
データベースをもう一度見てみましょう:
したがって、形式は正しいので、コード行を Article.php に追加して、published_at が Carbon オブジェクトとして処理されるようにします:
protected $dates = ['published_at'];
まさにこんな感じです。Carbon の利点と使用機能については後ほど説明します。
queryScope
上記は、published_at を使用して記事の公開日を実装していますが、記事の公開日を 9 に設定したばかりなので、現在の記事の表示は元のスタイルのままです。これは私たちが望む結果ではありません。 -12(記事は9-08だったという書き込み)も表示されるので、制限する必要があります。まず、クエリ時に直接実装できます。たとえば、ArticleController の Index() メソッドに次のようなクエリ ステートメントを記述します。見てみましょう。
これで、なぜ qeuryScope の使用法を導入する必要があるのかがわかります。これは、コードの再利用性を考慮して、たとえば Article::where('published_at','<=',Carbon::now()) を複数の場所で使用する場合、条件付きの制限があるからです。クエリステートメントは次のような形式で記述できますか?
すごいですwhere('published_at','<=',Carbon::now()) の代わりにカスタム メソッドpublished() を直接使用するだけで、コードが読みやすくなります。
所以我们就来说说,queryScope的用法了,想想我们之前设置published_at这个字段的目的:
我们希望可以对文章进行简单地管理,比如我们在写系列文章的时候,有可能一天写了好几篇,但是这种时候其实我们发一篇文章就好了,每天消化一篇文章就很不错了,所以作为作者,我并不想还没到发布日期的文章就展示给用户看,但是,我写了文章也想把它存入数据库,让它在该发布的日期自动显示,这样就好了。于是,我们可以好好利用一下published_at这个字段
在我们的Article.php中增加下面的方法:
public function scopePublished($query){ $query->where('published_at','<=',Carbon::now());}
这里注意一下写法scope+自定义的方法名字,还有就是一如既往的驼峰法。比如我们想使用published()这个方法,就定义为scopePublished($query)。这个时候就可以真正的使用上面说的查询了,在ArticleController的index()方法中:
$articles = Article::latest()->published()->get();
再去看看效果,相信你刷新之后还是一样的。
又是最后的结尾了,这里我们简单的介绍了queryScope和setAttribute的用法,下一节打算说说Eloquent的一个重要的内容:Eloquent Relationship。那个时候也就会越来越觉得laravel的强大了。
最后:Happy Hacking