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.