Laravel 5シリーズチュートリアル8: queryScopeとsetAttribute
Laravist は私が立ち上げたばかりの Laravel コミュニティです。Laravel に関する質問がある場合は、ここに来て質問してください。問題を解決するのに最適です。後でいくつかのビデオチュートリアルを録画してみます。形式はおそらく次のとおりです原文は https://laravist.com/article/16 より
https://laravist.com/lesson/1
前のセクションで述べたことに従ってください。 laravelの使用法におけるqueryScopeとsetAttributeについて話しましょう。
アプリケーション シナリオについて
ここでまず、これら 2 つの知識ポイントのアプリケーション シナリオについて簡単に説明します。開発するときは、常に怠惰な方法を使用することを望んでいます。そのため、次の 2 つのシナリオを検討してください。たとえば、簡単な例を考えてみましょう。ユーザーのログイン パスワードを保存するときは、何らかの方法でパスワードを暗号化してデータベースに書き込む必要があります。フォーム送信後に渡されるデータを毎回暗号化しますか?パスワードをデータベースに保存する前に自動的に暗号化するメカニズムはありますか?このようにして、フォームを処理するときにパスワードの暗号化について心配する必要がなくなります
考えてみてください、ユーザーに表示するデータは基本的にデータベースから取得されたものなのでしょうか?この場合、多くのクエリ ステートメントが繰り返されることがよくありますが、コードを記述する行では、基本的に、複数の繰り返しがあると、最適化メソッドが存在します。その場合に、queryScope が登場します。便利です
前に、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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。
