How to use EntityFieldQuery's entityCondition() in Drupal 7
Drupal 7 has a powerful query class EntityFieldQuery
in its core.
There’re 3 main methods to specify conditions (which become WHERE
clauses when converted to SQL) in EntityFieldQuery
.
entityCondition()
propertyCondition()
fieldCondition()
The following is a typical usage for that.
// Get node ids with the following conditions.// - ccontent type: "page"// - language: "neutral"// - body contains "hello" in it.$query = new EntityFieldQuery();$query->entityCondition('entity_type', 'node')->entityCondition('bundle', 'page')->propertyCondition('language', LANGUAGE_NONE)->fieldCondition('body', 'format', 'filtered_html')->fieldCondition('body', 'value', '%hello%', 'LIKE');$result = $query->execute();
propertyCondition()
and fieldCondition()
are simple and intuitive but entityCondition()
is a little tricky (I think).
As the name suggests, propertyCondition()
can be used to set conditions for the entity base table.
On the other hand, fieldCondition()
is a method for setting conditions for value columns in field data tables.
entityCondition()
is not like them. This is a special method to specify other types of conditions.
Basically four types of parameters can be passed to entityCondition()
.
entity_type
bundle
entity_id
revision_id
Among them, most used and tricky one is entity_type
.
In some cases entity_type
must be specified, but in other cases, it can be optional. Whether entity_type
is mandatory or not depends on the other conditions specified in the query instance.
Here are the 3 simplest patterns to understand the rule.
Pattern A:
// [x] entity condition// [ ] property condition// [ ] field condition// -> entity_type is mandatory.// -> Only single entity type can be searched.$query = new EntityFieldQuery();$query->entityCondition('entity_type', 'node')->entityCondition('bundle', 'page');$result = $query->execute();
Pattern B:
// [ ] entity condition// [x] property condition// [ ] field condition// -> entity_type is mandatory.// -> Only single entity type can be searched.$query = new EntityFieldQuery();$query->entityCondition('entity_type', 'node')->propertyCondition('uid', 15);$result = $query->execute();
Pattern C:
// [ ] entity condition// [ ] property condition// [x] field condition// -> entity_type is optional.// -> Multiple entity types can be searched.$query = new EntityFieldQuery();$query->fieldCondition('body', 'value', '%hello%', 'LIKE');$result = $query->execute();
That is, basically it’s necessary to specify entity_type
. But in limited cases where only field conditions need to be specified, entity_type
becomes optional.
The other types of entity condition can be used without complicated rules like above.
bundle
entity_id
revision_id
Actually this information is documented in the official comment. If you are interested, please try checking it for more information.