CounterCacheBehavior
extends Behavior
in package
CounterCache behavior
Enables models to cache the amount of connections in a given relation.
Examples with Post model belonging to User model
Regular counter cache
[
'Users' => [
'post_count'
]
]
Counter cache with scope
[
'Users' => [
'posts_published' => [
'conditions' => [
'published' => true
]
]
]
]
Counter cache using custom find
[
'Users' => [
'posts_published' => [
'finder' => 'published' // Will be using findPublished()
]
]
]
Counter cache using lambda function returning the count This is equivalent to example #2
[
'Users' => [
'posts_published' => function (EventInterface $event, EntityInterface $entity, Table $table) {
$query = $table->find('all')->where([
'published' => true,
'user_id' => $entity->get('user_id')
]);
return $query->count();
}
]
]
When using a lambda function you can return false
to disable updating the counter value
for the current operation.
Ignore updating the field if it is dirty
[
'Users' => [
'posts_published' => [
'ignoreDirty' => true
]
]
]
You can disable counter updates entirely by sending the ignoreCounterCache
option
to your save operation:
$this->Articles->save($article, ['ignoreCounterCache' => true]);
Table of Contents
Properties
- $_config : array<string, mixed>
- Runtime config
- $_configInitialized : bool
- Whether the config property has already been configured with defaults
- $_defaultConfig : array<string, mixed>
- Default configuration
- $_ignoreDirty : array<string, array<string, bool>>
- Store the fields which should be ignored
- $_reflectionCache : array<string, array<string|int, mixed>>
- Reflection method cache for behaviors.
- $_table : Table
- Table instance.
Methods
- __construct() : mixed
- Constructor
- afterDelete() : void
- afterDelete callback.
- afterSave() : void
- afterSave callback.
- beforeSave() : void
- beforeSave callback.
- configShallow() : $this
- Merge provided config with existing config. Unlike `config()` which does a recursive merge for nested keys, this method does a simple merge.
- getConfig() : mixed
- Returns the config.
- getConfigOrFail() : mixed
- Returns the config for this specific key.
- getTable() : Table
- Get the table instance this behavior is bound to.
- implementedEvents() : array<string, mixed>
- Gets the Model callbacks this behavior is interested in.
- implementedFinders() : array<string|int, mixed>
- implementedFinders
- implementedMethods() : array<string|int, mixed>
- implementedMethods
- initialize() : void
- Constructor hook method.
- setConfig() : $this
- Sets the config.
- table() : Table
- Get the table instance this behavior is bound to.
- verifyConfig() : void
- verifyConfig
- _configDelete() : void
- Deletes a single config key.
- _configRead() : mixed
- Reads a config key.
- _configWrite() : void
- Writes a config key.
- _getCount() : int
- Fetches and returns the count for a single field in an association
- _processAssociation() : void
- Updates counter cache for a single association
- _processAssociations() : void
- Iterate all associations and update counter caches.
- _reflectionCache() : array<string|int, mixed>
- Gets the methods implemented by this behavior
- _resolveMethodAliases() : array<string|int, mixed>
- Removes aliased methods that would otherwise be duplicated by userland configuration.
- _shouldUpdateCount() : bool
- Checks if the count should be updated given a set of conditions.
Properties
$_config
Runtime config
protected
array<string, mixed>
$_config
= []
$_configInitialized
Whether the config property has already been configured with defaults
protected
bool
$_configInitialized
= false
$_defaultConfig
Default configuration
protected
array<string, mixed>
$_defaultConfig
= []
These are merged with user-provided configuration when the behavior is used.
$_ignoreDirty
Store the fields which should be ignored
protected
array<string, array<string, bool>>
$_ignoreDirty
= []
$_reflectionCache
Reflection method cache for behaviors.
protected
static array<string, array<string|int, mixed>>
$_reflectionCache
= []
Stores the reflected method + finder methods per class. This prevents reflecting the same class multiple times in a single process.
$_table
Table instance.
protected
Table
$_table
Methods
__construct()
Constructor
public
__construct(Table $table[, array<string, mixed> $config = [] ]) : mixed
Merges config with the default and store in the config property
Parameters
- $table : Table
-
The table this behavior is attached to.
- $config : array<string, mixed> = []
-
The config for this behavior.
afterDelete()
afterDelete callback.
public
afterDelete(EventInterface $event, EntityInterface $entity, ArrayObject $options) : void
Makes sure to update counter cache when a record is deleted.
Parameters
- $event : EventInterface
-
The afterDelete event that was fired.
- $entity : EntityInterface
-
The entity that was deleted.
- $options : ArrayObject
-
The options for the query
afterSave()
afterSave callback.
public
afterSave(EventInterface $event, EntityInterface $entity, ArrayObject $options) : void
Makes sure to update counter cache when a new record is created or updated.
Parameters
- $event : EventInterface
-
The afterSave event that was fired.
- $entity : EntityInterface
-
The entity that was saved.
- $options : ArrayObject
-
The options for the query
beforeSave()
beforeSave callback.
public
beforeSave(EventInterface $event, EntityInterface $entity, ArrayObject $options) : void
Check if a field, which should be ignored, is dirty
Parameters
- $event : EventInterface
-
The beforeSave event that was fired
- $entity : EntityInterface
-
The entity that is going to be saved
- $options : ArrayObject
-
The options for the query
configShallow()
Merge provided config with existing config. Unlike `config()` which does a recursive merge for nested keys, this method does a simple merge.
public
configShallow(array<string, mixed>|string $key[, mixed|null $value = null ]) : $this
Setting a specific value:
$this->configShallow('key', $value);
Setting a nested value:
$this->configShallow('some.nested.key', $value);
Updating multiple config settings at the same time:
$this->configShallow(['one' => 'value', 'another' => 'value']);
Parameters
- $key : array<string, mixed>|string
-
The key to set, or a complete array of configs.
- $value : mixed|null = null
-
The value to set.
Return values
$thisgetConfig()
Returns the config.
public
getConfig([string|null $key = null ][, mixed $default = null ]) : mixed
Usage
Reading the whole config:
$this->getConfig();
Reading a specific value:
$this->getConfig('key');
Reading a nested value:
$this->getConfig('some.nested.key');
Reading with default value:
$this->getConfig('some-key', 'default-value');
Parameters
- $key : string|null = null
-
The key to get or null for the whole config.
- $default : mixed = null
-
The return value when the key does not exist.
Return values
mixed —Configuration data at the named key or null if the key does not exist.
getConfigOrFail()
Returns the config for this specific key.
public
getConfigOrFail(string $key) : mixed
The config value for this key must exist, it can never be null.
Parameters
- $key : string
-
The key to get.
Tags
Return values
mixed —Configuration data at the named key
getTable()
Get the table instance this behavior is bound to.
public
getTable() : Table
Use table() instead.
Return values
Table —The bound table instance.
implementedEvents()
Gets the Model callbacks this behavior is interested in.
public
implementedEvents() : array<string, mixed>
By defining one of the callback methods a behavior is assumed to be interested in the related event.
Override this method if you need to add non-conventional event listeners. Or if you want your behavior to listen to non-standard events.
Return values
array<string, mixed>implementedFinders()
implementedFinders
public
implementedFinders() : array<string|int, mixed>
Provides an alias->methodname map of which finders a behavior implements. Example:
[
'this' => 'findThis',
'alias' => 'findMethodName'
]
With the above example, a call to $table->find('this')
will call $behavior->findThis()
and a call to $table->find('alias')
will call $behavior->findMethodName()
It is recommended, though not required, to define implementedFinders in the config property of child classes such that it is not necessary to use reflections to derive the available method list. See core behaviors for examples
Tags
Return values
array<string|int, mixed>implementedMethods()
implementedMethods
public
implementedMethods() : array<string|int, mixed>
Provides an alias->methodname map of which methods a behavior implements. Example:
[
'method' => 'method',
'aliasedMethod' => 'somethingElse'
]
With the above example, a call to $table->method()
will call $behavior->method()
and a call to $table->aliasedMethod()
will call $behavior->somethingElse()
It is recommended, though not required, to define implementedFinders in the config property of child classes such that it is not necessary to use reflections to derive the available method list. See core behaviors for examples
Tags
Return values
array<string|int, mixed>initialize()
Constructor hook method.
public
initialize(array<string, mixed> $config) : void
Implement this method to avoid having to overwrite the constructor and call parent.
Parameters
- $config : array<string, mixed>
-
The configuration settings provided to this behavior.
setConfig()
Sets the config.
public
setConfig(array<string, mixed>|string $key[, mixed|null $value = null ][, bool $merge = true ]) : $this
Usage
Setting a specific value:
$this->setConfig('key', $value);
Setting a nested value:
$this->setConfig('some.nested.key', $value);
Updating multiple config settings at the same time:
$this->setConfig(['one' => 'value', 'another' => 'value']);
Parameters
- $key : array<string, mixed>|string
-
The key to set, or a complete array of configs.
- $value : mixed|null = null
-
The value to set.
- $merge : bool = true
-
Whether to recursively merge or overwrite existing config, defaults to true.
Tags
Return values
$thistable()
Get the table instance this behavior is bound to.
public
table() : Table
Return values
Table —The bound table instance.
verifyConfig()
verifyConfig
public
verifyConfig() : void
Checks that implemented keys contain values pointing at callable.
Tags
_configDelete()
Deletes a single config key.
protected
_configDelete(string $key) : void
Parameters
- $key : string
-
Key to delete.
Tags
_configRead()
Reads a config key.
protected
_configRead(string|null $key) : mixed
Parameters
- $key : string|null
-
Key to read.
_configWrite()
Writes a config key.
protected
_configWrite(array<string, mixed>|string $key, mixed $value[, string|bool $merge = false ]) : void
Parameters
- $key : array<string, mixed>|string
-
Key to write to.
- $value : mixed
-
Value to write.
- $merge : string|bool = false
-
True to merge recursively, 'shallow' for simple merge, false to overwrite, defaults to false.
Tags
_getCount()
Fetches and returns the count for a single field in an association
protected
_getCount(array<string, mixed> $config, array<string|int, mixed> $conditions) : int
Parameters
- $config : array<string, mixed>
-
The counter cache configuration for a single field
- $conditions : array<string|int, mixed>
-
Additional conditions given to the query
Return values
int —The number of relations matching the given config and conditions
_processAssociation()
Updates counter cache for a single association
protected
_processAssociation(EventInterface $event, EntityInterface $entity, Association $assoc, array<string|int, mixed> $settings) : void
Parameters
- $event : EventInterface
-
Event instance.
- $entity : EntityInterface
-
Entity
- $assoc : Association
-
The association object
- $settings : array<string|int, mixed>
-
The settings for counter cache for this association
Tags
_processAssociations()
Iterate all associations and update counter caches.
protected
_processAssociations(EventInterface $event, EntityInterface $entity) : void
Parameters
- $event : EventInterface
-
Event instance.
- $entity : EntityInterface
-
Entity.
_reflectionCache()
Gets the methods implemented by this behavior
protected
_reflectionCache() : array<string|int, mixed>
Uses the implementedEvents() method to exclude callback methods.
Methods starting with _
will be ignored, as will methods
declared on Cake\ORM\Behavior
Tags
Return values
array<string|int, mixed>_resolveMethodAliases()
Removes aliased methods that would otherwise be duplicated by userland configuration.
protected
_resolveMethodAliases(string $key, array<string, mixed> $defaults, array<string, mixed> $config) : array<string|int, mixed>
Parameters
- $key : string
-
The key to filter.
- $defaults : array<string, mixed>
-
The default method mappings.
- $config : array<string, mixed>
-
The customized method mappings.
Return values
array<string|int, mixed> —A de-duped list of config data.
_shouldUpdateCount()
Checks if the count should be updated given a set of conditions.
protected
_shouldUpdateCount(array<string|int, mixed> $conditions) : bool
Parameters
- $conditions : array<string|int, mixed>
-
Conditions to update count.
Return values
bool —True if the count update should happen, false otherwise.