What are the differences between an elementCriteriaModel and fetched elements? I am a little confused about the differences between an elementCriteriaModel and fetched elements.

Why do I sometimes have to fetch elements with first(), last(), find():

{% set entries = craft.entries.section('cocktails').find() %}


and in other cases the elementCriteriaModel is enough:

{% set params = craft.entries.section('cocktails') %}
{% set prev   = entry.getPrev(params) %}
The ElementCriteriaModel and the individual element models (like the EntryModel) can be thought of as two different points of time in retrieving data from your database. Essentially, you'll use an ElementCriteriaModel before the database is queried and the element models afterwards.


  Why do I sometimes have to fetch elements with .first(), .last(), .find()…


The ElementCriteriaModel does what it says on the tin — it specifies criteria to find elements. When you call .find(), .first() or .last(), the model sends itself off to the ElementsService which will return element models, based on your criteria.


  …and in other cases the ElementCriteriaModel is enough?


Internally, Craft is using ElementCriteriaModels to work things out. For pagination or the .getPrev() example, Craft is finding elements using the same criteria, but it's using it in a different way to .find() or similar methods.

You can omit the .find() method and treat the ElementCriteriaModel as an array, but it depends on your scenario. As was touched on here, there are performance impacts to consider.