目次
ただし、これは私たちが望んでいることではありません。記事の公開日を設定するなどの制御可能な方法があればいいのですが、フォームなので、それを実装しましょう: まず、create.blade.php で、published_at フィールドをフォームに配置し、published_at 入力ボックス入力を追加します:
总结
ホームページ バックエンド開発 PHPチュートリアル Laravel 5シリーズチュートリアル8: queryScopeとsetAttribute

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

Jun 23, 2016 pm 01:26 PM

原文は 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

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

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

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

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

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

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

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

    PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

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

    Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

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

    Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

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

    PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

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

    フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

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

    フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

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

    See all articles