Laravel 의 Model 층 에서 데이터 캐 시 를 만 드 는 실현
모델 의 유일한 캐 시 키 를 사용 하면 캐 시 모델(또는 관련 모델)을 업데이트 할 때 자동 으로 업데이트(캐 시 실효)모델 의 속성 과 관련 이 있 습 니 다.하나의 장점 은 캐 시 에 접근 하 는 데이터 가 컨트롤 러 에 캐 시 된 데이터 보다 더 재 활용 성 이 있 기 때 문 입 니 다.하나의 컨트롤 러 방법 이 아 닌 모델 에 있 기 때 문 입 니 다.
이것 은 이 기술 의 요점 이다.
네가 여러 개 있다 고 가정 해 봐
Comment
. Article
모형,아래 의 Laravel blade 템 플 릿 을 지정 하면 아래 와 같이 접근 할 수 있 습 니 다. /article/:id
경로 에서 댓 글 을 받 을 수 있 는 수량:
<h3>$article->comments->count() {{ str_plural('Comment', $article->comments->count())</h3>
컨트롤 러 에 댓 글 을 캐 시 할 수 있 습 니 다.하지만 캐 시 를 필요 로 하 는 일회 성 조회 와 데이터 가 여러 개 있 을 때 컨트롤 러 는 매우 비대 해 집 니 다.컨트롤 러 를 사용 하면 캐 시 에 접근 하 는 데이터 도 불편 합 니 다.글 이 업 데 이 트 될 때 만 데이터 베 이 스 를 방문 하고 이 모델 의 모든 코드 를 방문 하면 캐 시 값 을 가 져 올 수 있 는 템 플 릿 을 구축 할 수 있 습 니 다.
<h3>$article->cached_comments_count {{ str_plural('Comment', $article->cached_comments_count)</h3>
모델 접근 기 를 사용 하면 마지막 글 업데이트 에 기반 한 댓 글 수 치 를 캐 시 할 수 있 습 니 다.따라서 댓 글 이 새로 추가 되 거나 삭 제 될 때 우 리 는 어떻게 글 을 업데이트 해 야 합 니까?
updated_at
열 값 은?먼저 터치 방법 으로 들 어가 보 세 요.
모델 의 트리거
모델 을 사용 할 수 있어 요.
touch()
방법 updated_at
열 값:
$ php artisan 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
우 리 는 업 데 이 트 된 timestamp 값 으로 캐 시 를 무효 화 할 수 있 습 니 다.그러나 댓 글 을 추가 하거나 삭제 할 때 수정 글 을 어떻게 터치 합 니까? 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
의 timestamp 값 으로 구성 되 어 있 습 니 다.이 모델 을 터치 하면 timestamp 값 이 업데이트 되 고 모델 캐 시 는 효력 을 잃 습 니 다.다음은
Article
모델 의 전체 코드:
<?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();
});
}
}
그리고 관련 된 거. Comment
모형:
<?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();
});
}
마지막 으로 나 는 Article
모델 에서cacheKey()
방법 을 정 의 했 지만 이름 을 통 해 ProvidesModelCacheKey
의 trait 는 복합 모델 에서 사용 하거나 기본 모델 에서 모든 모델 확장 방법 을 정의 할 수 있 도록 이 방법 을 정의 합 니 다.너 는 심지어 실현 을 위해cacheKey()
방법의 모형 사용 계약(인터페이스).나 는 네가 이미 이 간단 한 기술 이 매우 유용 하 다 는 것 을 발견 하 기 를 바란다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
단순 Laravel+Vue.js에서 VueUI를 사용하여 로그인 및 등록Laravel에는 웹 팩과 같은 Laravel-Mix가 있는데, 이를 이용해서 Laravel에 Vue.js를 실현할 수 있다. 이번에는 몇 가지 명령을 통해 간단하게 VueUI로 로그인하여 로그인을 할 수 있습니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.