2011-05-16 3 views
8

Existe-t-il une manière plus optimale et plus rapide d'obtenir des nœuds avec certaines conditions?EntityFieldQuery plusieurs conditions alternatives

$query = new EntityFieldQuery; 
$result = $query 
    ->entityCondition('entity_type', 'node') 
    ->propertyCondition('type', $node_type) 
    ->propertyCondition('title', $title) 
    ->fieldCondition('field_number', 'value', '1', '='); 
    ->propertyCondition('status', 1, '=') 
    ->execute(); 

// $result['node'] contains a list of nids where the title matches 
if (!empty($result['node']) { 
    // You could use node_load_multiple() instead of entity_load() for nodes 
    $nodes = entity_load('node', array_keys($result['node'])); 
} 

$query_two = new EntityFieldQuery; 
$result_two = $query_two 
    ->entityCondition('entity_type', 'node') 
    ->propertyCondition('type', $node_type) 
    ->propertyCondition('title', $title) 
    ->fieldCondition('field_number', 'value', '2', '='); 
    ->propertyCondition('status', 1, '=') 
    ->execute(); 

// $result_two['node'] contains a list of nids where the title matches 
if (!empty($result_two['node']) { 
    // You could use node_load_multiple() instead of entity_load() for nodes 
    $nodes_two = entity_load('node', array_keys($result_two['node'])); 
} 

Répondre

13

Eh bien, vous pouvez certainement utiliser ->fieldCondition('field_number', 'value', array(1, 2)), mais à part ça, pas que je sache (et je l'ai écrit EntityFieldQuery). Même si vous deviez réécrire ceci à une requête de stockage SQL seulement, ce ne serait pas beaucoup plus simple.

Vous n'avez pas besoin de spécifier = comme opérateur et vous n'avez pas besoin non plus de spécifier IN, ils sont par défaut pour une valeur scalaire/tableau.

+0

Merci d'avoir pris le temps de répondre à cette question et merci pour EFQ, c'est une fonction géniale. – Sam152

1

J'ai récemment écrit un wrapper pour EntityFieldQuery, puisque je l'utilise trop. Ensuite, la façon dont je l'appelle devient, le résultat peut être un identifiant ou un tableau d'identifiants. J'espère que cela a du sens.

$ids = qplot_api_find_nodes2(
    array(
     'type' => 'content', 
     'field_content_project' => array('target_id', 10, '='), 
    ), 
    array(
     'created' => 'ASC' 
    ), 
    TRUE 
); 

/** 
* Returns node nid(s) with filters and sorts. 
* 
* @param array $conds 
* Condition entries, there're three different type of conditions 
* 1. prefixed with entity_, ex. 'entity_type' => 'node' 
* 2. prefixed with field_, ex. 'field_project', 
*  two formats allowed, simple version 'field_tag' => 'abc', 
*  or long version, 'field_tag' => array('target_id', 11, '=') 
* 3. no prefix or other prefix, 'title' => 'abc' 
* Default $conds contains 'entity_type' => 'node' entry. 
* 
* @param array $sorts 
* Sort entiries, there're two different type of sorts 
* 1. prefixed with field_, ex. 'field_tag' => array('target_id', 'ASC') 
* 2. no prefix or other prefix, 'title' => 'ASC' 
* Default $sorts are empty 
* 
* @param bool $all 
* If all matching nid are returned, or just the first one, default FALSE 
* 
* @return int 
* The nid for the supplied id or 0 if not found. 
* Or array of nids if $all = TRUE 
* 
* @author Fang Jin <[email protected]> 
*/ 
function qplot_api_find_nodes2($conds, $sorts = NULL, $all = FALSE) { 
    $conds = array_merge(array('entity_type' => 'node'), $conds); 
    if (empty($sorts)) { 
     $sorts = array(); 
    } 

    $query = new EntityFieldQuery(); 

    // apply condition to query 
    foreach ($conds as $key => $value) { 
     $splits = explode('_', $key); 
     $type = $splits[0]; 
     if (count($splits) == 1) { 
      $type = 'property'; 
     } 

     switch ($type) { 
      case 'entity': 
      $query->entityCondition($key, $value); 
      break; 

      case 'field': 
      if (is_array($value)) { 
       $property = isset($value[1]) ? $value[0] : 'value'; 
       $assigned = isset($value[1]) ? $value[1] : $value[0]; 
       $operator = isset($value[2]) ? $value[2] : '='; 
       $query->fieldCondition($key, $property, $assigned, $operator); 
      } else { 
       $query->fieldCondition($key, 'value', $value); 
      } 
      break; 

      // rest of them are all property 
      default: 
      $query->propertyCondition($key, $value); 
      break; 
     } 
    } 

    // apply sort to query 
    foreach ($sorts as $key => $value) { 
     $splits = explode('_', $key); 
     $type = $splits[0]; 
     if (count($splits) == 1) { 
      $type = 'property'; 
     } 

     switch ($type) { 
      case 'field': 
      $query->fieldOrderBy($key, $value[0], $value[1]); 
      break; 

      default: 
      $query->propertyOrderBy($key, $value); 
      break; 
     } 
    } 

    $result = $query->execute(); 
    $ctype = $conds['entity_type']; 
    if (!empty($result[$ctype])) { 
     $keys = array_keys($result[$ctype]); 
     if ($all) { 
      return $keys; 
     } 
     else { 
      return $keys[0]; 
     } 
    } else { 
     if ($all) { 
      return array(); 
     } else { 
      return 0; 
     } 
    } 
}