You say you're using your own MVC pattern framework so it's hard to give a specific recommendation.
There are a few places you can cache.
If you use HTTP properly (idempotency, etags, cache-control headers, etc), you might benefit from placing the caching layer outside the application and using a forward cache like varnish to cache whole pages. However, it's very easy to get HTTP wrong, so this may not be the way to go. For example, if you have user accounts and the same url produces different server output depending on what user is logged in, you can't use HTTP caching because your resource depends on cookie state. (What you should do is put the user into the url, E.g. /mysite/{userid}/profile instead of /mysite/profile.) You may still be able to use varnish via its more advanced features, but it will be more difficult.
You say you are just interested in caching database query results, so I'll address that.
If you have a few well-defined queries where you want to cache a database response, you can put the logic in the controller: before you pass a model on to the view, cache it explicitly. This solution produces a messy codebase if you have multiple places to cache. Also, if you are retrieving the same data in different controllers, you will need to carefully and manually ensure that all controller code that retrieves the same models also consults the cache and uses the same cache key. Obviously, it also becomes difficult to turn caching on and off.
A cleaner solution is to wrap your models in a way that caches results transparently. This means you can add caching declaratively without making substantial changes to your controllers or models. However, this requires having a very well designed model api, which you may not have.