In my project (on Drupal 7) I'm using EntityFieldQuery alot to get some entities with given conditions, but working with resulting array of execute() function - is boring and makes code dirty IMHO. So I created helper class used only to load entities. Most of the time result is self describing one-liners instead of variables mess. I know it not covers all posibilities of EntityQuery, but 90% of my usage of it is loading Entities with some conditions. With the help of my class, loading one entity with conditions will be as simple as:
$country = (new EntityLoadQuery('country'))->propertyCondition('city_tid', 88)->loadSingle();
Here is the code of class used in Drupal 7:
<?php /** * Easily load entities with power of EntityFieldQuery * * Usage example: * $country = (new EntityLoadQuery('country'))->propertyCondition('city_tid', 88)->loadSingle(); * * @author Kirill Kuzmitskyy (toopro.org) */ class EntityLoadQuery extends EntityFieldQuery { /** * @param string $entity_type tell the type of the entity to load */ public function __construct($entity_type) { $this->entityCondition('entity_type', $entity_type); } /** * @param $entity_type tell the type of the entity to load * @return EntityLoad */ public static function query($entity_type) { return new EntityLoad($entity_type); } /** * @return array of loaded entities keyed by Names or IDs */ public function load() { $eqResult = $this->execute(); foreach ($eqResult as $entity_type=>$keyedArray) return (module_exists('entity')) ? entity_load_multiple_by_name($entity_type, array_keys($keyedArray)) : entity_load($entity_type, array_keys($keyedArray)); return array(); } /** * @return object one loaded entity of given type */ public function loadSingle() { $ents = $this->load(); return reset($ents); } /** * @return array of Names or IDs of the entities matching query */ public function loadIDs() { $eqResult = $this->execute(); $eqResult = reset($eqResult); return ($eqResult) ? $eqResult : array(); } } ?>
As the result, instead of doing like this:
<?php $result = (new EntityFieldQuery()) ->entityCondition('entity_type','country') ->propertyCondition('city_tid', 55) ->execute(); if (isset($result['country'])) { $news_items_ids = array_keys($result['country']); $entities = entity_load('country', $news_items_nids); $country = reset($entities); } ?>
I have this code:
<?php $country = EntityLoad::query('country')->propertyCondition('city_tid', 88)->loadSingle(); ?>
I think it's more readable and less non-business logic in code. Hope someone will like it too :) And correct me if I'm doing something wrong with such approach.
- Log in to post comments