Repository URL to install this package:
|
Version:
1.0.0 ▾
|
<?php
/**
* Created by PhpStorm.
* User: danilo
* Date: 02/03/16
* Time: 14:06
*/
namespace Modules\Core\Database\Behaviours\CountCache;
use Illuminate\Database\Eloquent\Model;
use Modules\Core\Database\Behaviours\Cacheable;
class CountCache
{
use Cacheable;
/**
* @var Model
*/
private $model;
/**
* @param Model $model
*/
public function __construct(Model $model)
{
$this->model = $model;
}
/**
* Update the cache for all operations.
*/
public function update()
{
$this->apply(function ($config) {
$foreignKey = $this->key($config['foreignKey']);
if ($this->model->getOriginal($foreignKey) && $this->model->{$foreignKey} != $this->model->getOriginal($foreignKey)) {
$this->updateCacheRecord($config, '-', 1, $this->model->getOriginal($foreignKey));
$this->updateCacheRecord($config, '+', 1, $this->model->{$foreignKey});
}
});
}
/**
* Applies the provided function to the count cache setup/configuration.
*
* @param \Closure $function
*/
public function apply(\Closure $function)
{
foreach ($this->model->countCaches() as $key => $cache) {
$function($this->config($key, $cache));
}
}
/**
* Takes a registered counter cache, and setups up defaults.
*
* @param string $cacheKey
* @param array $cacheOptions
* @return array
*/
protected function config($cacheKey, $cacheOptions)
{
$opts = [];
if (is_numeric($cacheKey)) {
if (is_array($cacheOptions)) {
// Most explicit configuration provided
$opts = $cacheOptions;
$relatedModel = array_get($opts, 'model');
} else {
// Smallest number of options provided, figure out the rest
$relatedModel = $cacheOptions;
}
} else {
// Semi-verbose configuration provided
$relatedModel = $cacheOptions;
$opts['field'] = $cacheKey;
if (is_array($cacheOptions)) {
if (isset($cacheOptions[2])) {
$opts['key'] = $cacheOptions[2];
}
if (isset($cacheOptions[1])) {
$opts['foreignKey'] = $cacheOptions[1];
}
if (isset($cacheOptions[0])) {
$relatedModel = $cacheOptions[0];
}
}
}
return $this->defaults($opts, $relatedModel);
}
/**
* Returns necessary defaults, overwritten by provided options.
*
* @param array $options
* @param string $relatedModel
* @return array
*/
protected function defaults($options, $relatedModel)
{
$defaults = [
'model' => $relatedModel,
'field' => $this->field($this->model, 'count'),
'foreignKey' => $this->field($relatedModel, 'id'),
'key' => 'id'
];
return array_merge($defaults, $options);
}
/**
* Rebuild the count caches from the database
*/
public function rebuild()
{
$this->apply(function ($config) {
$this->rebuildCacheRecord($config, $this->model, 'COUNT');
});
}
}