我有一个名为Tournament
的模型,其中每个Tournament
都与它的某些关系一起缓存,使用每个模型的密钥(即tournament.1
)。
return \Cache::remember('tournament.' . $id, 60*24*7, function() use ($id) {
return Tournament::where('id', $id)
->with(['prizes', 'sponsor'])
->firstOrFail();
});
当我更新关系时,我想忘记那场比赛的钥匙。我知道我可以使用这样的事件:
public static function boot()
{
static::saving(function ($prize) {
\Cache::forget('tournament.' . $prize->tournament->id);
});
return parent::boot();
}
但是,这样做意味着我还必须针对所有其他关系重复此代码。我可能可以为此创建一个特征,但是是否有更好的方法来完成我想要实现的目标?
答案 0 :(得分:0)
我最终用特质解决了这个问题。
namespace App\Traits;
trait ShouldCacheBust
{
/**
* The "booting" method of the model.
*/
public static function boot()
{
static::saving(function ($model) {
$cacheKey = static::cacheBustKey($model);
if ($cacheKey) {
\Cache::forget($cacheKey);
}
});
return parent::boot();
}
/**
* Return the key to be removed from Cache
*
* @param Model $model
* @return string|null
*/
abstract public function cacheBustKey(Model $model);
}
然后像这样使用它:
/**
* Return the key to be removed from Cache
*
* @param Model $model
* @return mixed|string
*/
public static function cacheBustKey(Model $model)
{
return 'tournament.' . $model->id;
}