モデル データを以前にキャッシュしたことがあるかもしれませんが、動的ログ モデルを使用したより複雑な Laravel モデル キャッシュ手法を紹介します。これは、RailsCasts で学習した手法から始めました。
モデルの一意のキャッシュ キーを使用すると、モデル (または関連モデル) が更新されたときに自動的に更新 (およびキャッシュの無効化) されるプロパティと関連付けをモデルにキャッシュできます。利点の 1 つは、キャッシュされたデータへのアクセスが高速化されることです。キャッシュされたデータは、単一のコントローラー メソッドではなくモデル上にあるため、再利用可能です。
これがこのテクノロジーの重要なポイントです:
多くのコメント記事モデルがあると仮定し、次の Laravel ブレード テンプレートを指定すると、次のように /article/:id ルートにアクセスできます。コメント数を取得します:
<h3 id="article-comments-count-nbsp-nbsp-str-plural-Comment-nbsp-article-comments-count">$article->comments->count() {{ str_plural('Comment', $article->comments->count())</h3>
コメント数をコントローラーでキャッシュできますが、キャッシュする必要があるワンタイム クエリやデータが複数ある場合、コントローラーが非常に肥大化し、見苦しくなる可能性があります。 。コントローラーを使用してキャッシュされたデータにアクセスするのもあまり便利ではありません。
記事が更新されたときにのみデータベースにアクセスするテンプレートを構築でき、モデルにアクセスするすべてのコードでキャッシュされた値を取得できます。
<h3 id="article-cached-comments-count-nbsp-nbsp-str-plural-Comment-nbsp-article-cached-comments-count">$article->cached_comments_count {{ str_plural('Comment', $article->cached_comments_count)</h3>
モデル アクセサーを使用すると、次のことができます。キャッシュ 前回の記事更新に基づいたコメント数。
では、コメントが追加または削除されたときに、記事の updated_at 列の値をどのように更新すればよいでしょうか?
最初にタッチ方法を入力して確認してください。
モデルのトリガー
モデルの touch() メソッドを使用して、記事の updated_at 列の値を更新できます:
$ phpArtisan tinker
>>> $article = \App\Article::first(); => App\Article {#746 id: 1, title: "Hello World", body: "The Body", created_at: "2018-01-11 05:16:51", updated_at: "2018-01-11 05:51:07", } >>> $article->updated_at->timestamp => 1515649867 >>> $article->touch(); => true >>> $article->updated_at->timestamp => 1515650910
更新されたタイムスタンプ値を使用してキャッシュを無効にすることができます。しかし、コメントを追加または削除するときに、記事の updated_at フィールドの変更をトリガーするにはどうすればよいでしょうか?
Eloquent モデルには $touches と呼ばれるプロパティがあります。コメント モデルは次のようになります。
<?php namespace App; use App\Article; use Illuminate\Database\Eloquent\Model; class Comment extends Model { protected $guarded = []; protected $touches = ['article']; public function article() { return $this->belongsTo(Article::class); } }
ここの $touches プロパティは、コメントの作成、保存、削除時に「トリガー」を引き起こす関連情報を含む配列です。
キャッシュされたプロパティ
$article->cached_comments_count アクセサーに戻りましょう。このメソッドの実装は、App\Article モデルでは次のようになります:
public function getCachedCommentsCountAttribute() { return Cache::remember($this->cacheKey() . ':comments_count', 15, function () { return $this->comments->count(); }); }
一意のキー値のcacheKey() メソッドを使用してモデルを 15 分間キャッシュし、その後単にコメント カウント値を返します。クロージャーメソッドで。
キャッシュ メカニズムのガベージ コレクション戦略に基づいて、期限切れのキー値を削除するために Cache::rememberForever() メソッドも使用することに注意してください。 15 分ごとのキャッシュ更新間隔の間、ほとんどの時間でキャッシュのヒット率が最高になるようにタイマーを設定しました。
cacheKey() メソッドはモデルの一意のキー値を使用する必要があり、モデルが更新されると対応するキャッシュは無効になります。以下は私のcacheKey実装コードです:
public function cacheKey() { return sprintf( "%s/%s-%s", $this->getTable(), $this->getKey(), $this->updated_at->timestamp ); }
モデルのcacheKey()メソッドの出力結果の例は、次の文字列情報を返す場合があります:
articles/1-1515650910
このキー値はテーブル名とモデルIDで構成されます現在の updated_at の値とタイムスタンプ値。このモデルをトリガーすると、タイムスタンプ値が更新され、それに応じてモデル キャッシュが無効になります。
記事モデルの完全なコードは次のとおりです:
<?php namespace App; use App\Comment; use Illuminate\Support\Facades\Cache; use Illuminate\Database\Eloquent\Model; class Article extends Model { public function cacheKey() { return sprintf( "%s/%s-%s", $this->getTable(), $this->getKey(), $this->updated_at->timestamp ); } public function comments() { return $this->hasMany(Comment::class); } public function getCachedCommentsCountAttribute() { return Cache::remember($this->cacheKey() . ':comments_count', 15, function () { return $this->comments->count(); }); } }
次に、関連するコメント モデル:
<?php namespace App; use App\Article; use Illuminate\Database\Eloquent\Model; class Comment extends Model { protected $guarded = []; protected $touches = ['article']; public function article() { return $this->belongsTo(Article::class); } }
次に何をしますか?
単純なコメント数をキャッシュする方法を説明しましたが、すべてのコメントをキャッシュする場合はどうすればよいでしょうか?
public function getCachedCommentsAttribute() { return Cache::remember($this->cacheKey() . ':comments', 15, function () { return $this->comments; }); }
モデルをシリアル化する代わりにコメントを配列に変換して、フロントエンドのデータへの単純な配列アクセスのみを許可することもできます:
public function getCachedCommentsAttribute() { return Cache::remember($this->cacheKey() . ':comments', 15, function () { return $this->comments->toArray(); }); }
最後に、cacheKey を定義しました。 Article モデル () メソッド内にありますが、このメソッドを ProvidesModelCacheKey というトレイトを介して定義して、複合モデルで使用したり、基本モデルのすべてのモデル拡張機能のメソッドを定義したりすることもできます。さらに、cacheKey() メソッドを実装するモデルのコントラクト (インターフェイス) を使用することもできます。
推奨チュートリアル: 「PHP チュートリアル」「Laravel」
以上がLaravelのモデル層でデータをキャッシュするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Laravelは、バックエンド開発で強く機能し、Eloquentorm、コントローラー、サービスクラスを介してデータベース操作を簡素化し、ビジネスロジックを処理し、キュー、イベント、その他の機能を提供します。 1)Eloquentormは、モデルを介してデータベーステーブルをマップしてクエリを簡素化します。 2)ビジネスロジックは、モジュール性と保守性を向上させるために、コントローラーとサービスクラスで処理されます。 3)キューシステムなどのその他の機能は、複雑なニーズの処理に役立ちます。

Laravel Developmentプロジェクトは、さまざまなサイズと複雑さのニーズに合う柔軟性とパワーのために選択されました。 Laravelは、ルーティングシステム、Eloquentorm、Artisan Command Lineおよびその他の機能を提供し、簡単なブログから複雑なエンタープライズレベルのシステムへの開発をサポートしています。

開発環境とエコシステムにおけるLaravelとPythonの比較は次のとおりです。1。Laravelの開発環境は簡単で、PHPと作曲家のみが必要です。 Laravelforgeなどの豊富な範囲の拡張パッケージを提供しますが、拡張パッケージのメンテナンスはタイムリーではない場合があります。 2。Pythonの開発環境もシンプルで、PythonとPIPのみが必要です。エコシステムは巨大で複数のフィールドをカバーしていますが、バージョンと依存関係の管理は複雑な場合があります。

Laravelはバックエンドロジックでどのように役割を果たしますか?ルーティングシステム、Eloquentorm、認証と承認、イベントとリスナー、パフォーマンスの最適化を通じてバックエンド開発を簡素化および強化します。 1.ルーティングシステムにより、URL構造の定義とリクエスト処理ロジックが可能になります。 2.Eloquentormは、データベースの相互作用を簡素化します。 3.認証および承認システムは、ユーザー管理に便利です。 4.イベントとリスナーは、ゆるく結合したコード構造を実装します。 5.パフォーマンスの最適化により、キャッシュとキューイングを通じてアプリケーションの効率が向上します。

Laravelの人気には、単純化された開発プロセスが含まれ、快適な開発環境を提供し、豊富な機能が提供されます。 1)Rubyonrailsの設計哲学を吸収し、PHPの柔軟性を組み合わせています。 2)Eloquentorm、Bladeテンプレートエンジンなどのツールを提供して、開発効率を向上させます。 3)そのMVCアーキテクチャと依存関係噴射メカニズムにより、コードがよりモジュール化され、テスト可能になります。 4)キャッシュシステムやベストプラクティスなどの強力なデバッグツールとパフォーマンス最適化方法を提供します。

DjangoとLaravelはどちらもフルスタックのフレームワークです。 DjangoはPython開発者や複雑なビジネスロジックに適していますが、LaravelはPHP開発者とエレガントな構文に適しています。 1.DjangoはPythonに基づいており、迅速な発展と高い並行性に適した「バッテリーコンプリート」哲学に従います。 2. LaravelはPHPに基づいており、開発者エクスペリエンスを強調しており、小規模から中規模のプロジェクトに適しています。

LaravelはPHPベースのフレームワークであるため、PHPとLaravelは直接匹敵するものではありません。 1.PHPは、シンプルで直接的であるため、小規模プロジェクトや迅速なプロトタイピングに適しています。 2。LARAVELは、豊富な機能とツールを提供するため、大規模なプロジェクトや効率的な開発に適していますが、急な学習曲線があり、純粋なPHPほど良くない場合があります。

laravelisabackendframeworkbuiltonphp、designforwebapplicationdevelopment.itfocusonserver-sidelogic、databasemanagement、およびapplicationStructure、およびbueithedendtechnologiesvue.jsorreactforfull-stackdevelymentと統合されていること。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

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

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

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。
