2011-05-16 66 views
8

是否有更優化和更短的方式來獲得具有特定條件的節點?EntityFieldQuery多個替代條件

$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'])); 
} 

回答

13

嗯,你當然可以使用->fieldCondition('field_number', 'value', array(1, 2)),但除此之外,不,我知道的(我寫EntityFieldQuery)。即使你將這個改寫成只存儲SQL存儲的查詢,也不會太簡單。

您不需要指定=作爲運算符,也不需要指定IN,它們是標量/數組值的默認值。

+0

感謝您花時間回答這個問題並感謝EFQ,這是一個很棒的功能。 – Sam152 2012-06-28 01:40:08

1

我最近爲EntityFieldQuery編寫了一個包裝,因爲我只是使用它太多。然後我調用它的方式變爲,結果可以是id或id數組。希望這是有道理的。

$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; 
     } 
    } 
}