ホームページ > バックエンド開発 > PHPチュートリアル > Laravel 5シリーズチュートリアル8: queryScopeとsetAttribute

Laravel 5シリーズチュートリアル8: queryScopeとsetAttribute

WBOY
リリース: 2016-06-23 13:26:57
オリジナル
1127 人が閲覧しました

原文は https://laravist.com/article/16 より

Laravist は私が立ち上げたばかりの Laravel コミュニティです。Laravel に関する質問がある場合は、ここに来て質問してください。問題を解決するのに最適です。後でいくつかのビデオチュートリアルを録画してみます。形式はおそらく次のとおりです

https://laravist.com/lesson/1

前のセクションで述べたことに従ってください。 laravelの使用法におけるqueryScopeとsetAttributeについて話しましょう。

アプリケーション シナリオについて

ここでまず、これら 2 つの知識ポイントのアプリケーション シナリオについて簡単に説明します。開発するときは、常に怠惰な方法を使用することを望んでいます。そのため、次の 2 つのシナリオを検討してください。たとえば、簡単な例を考えてみましょう。ユーザーのログイン パスワードを保存するときは、何らかの方法でパスワードを暗号化してデータベースに書き込む必要があります。フォーム送信後に渡されるデータを毎回暗号化しますか?パスワードをデータベースに保存する前に自動的に暗号化するメカニズムはありますか?このようにして、フォームを処理するときにパスワードの暗号化について心配する必要がなくなります

  • 考えてみてください、ユーザーに表示するデータは基本的にデータベースから取得されたものなのでしょうか?この場合、多くのクエリ ステートメントが繰り返されることがよくありますが、コードを記述する行では、基本的に、複数の繰り返しがあると、最適化メソッドが存在します。その場合に、queryScope が登場します。便利です

  • setAttributes

    前に、published_at を記事作成の日付に設定しました:
  • $input['published_at'] = Carbon::now();
    ログイン後にコピー

    ただし、これは私たちが望んでいることではありません。記事の公開日を設定するなどの制御可能な方法があればいいのですが、フォームなので、それを実装しましょう: まず、create.blade.php で、published_at フィールドをフォームに配置し、published_at 入力ボックス入力を追加します:

    <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

    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート