Add: CounterCache feature to hasMany models

as discussed in issue #1879 
Any reason you opted for a full count and update rather than an atomic increment/decrement approach?
The current approach could likely fall out of sync under higher concurrency.