Laravel 의 Model 층 에서 데이터 캐 시 를 만 드 는 실현

이전에 모델 데 이 터 를 캐 시 했 을 수도 있 지만 동적 기록 모델 을 사용 하 는 더 정교 한 Laravel 모델 캐 시 기술 을 보 여 드 리 겠 습 니 다.이것 은 제 가 처음에  RailsCasts배 운 기술.
모델 의 유일한 캐 시 키 를 사용 하면 캐 시 모델(또는 관련 모델)을 업데이트 할 때 자동 으로 업데이트(캐 시 실효)모델 의 속성 과 관련 이 있 습 니 다.하나의 장점 은 캐 시 에 접근 하 는 데이터 가 컨트롤 러 에 캐 시 된 데이터 보다 더 재 활용 성 이 있 기 때 문 입 니 다.하나의 컨트롤 러 방법 이 아 닌 모델 에 있 기 때 문 입 니 다.
이것 은 이 기술 의 요점 이다.
네가 여러 개 있다 고 가정 해 봐CommentArticle  모형,아래 의 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() 방법의 모형 사용 계약(인터페이스).
나 는 네가 이미 이 간단 한 기술 이 매우 유용 하 다 는 것 을 발견 하 기 를 바란다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기