Db_select () 와 동일한 작업을 수행 하여 값을 가져올 수 있는데 왜 EntityFieldQuery를 사용해야합니까 ?
누군가가 링크뿐만 아니라 예를 제공 할 수 있다면 더 좋습니다.
Db_select () 와 동일한 작업을 수행 하여 값을 가져올 수 있는데 왜 EntityFieldQuery를 사용해야합니까 ?
누군가가 링크뿐만 아니라 예를 제공 할 수 있다면 더 좋습니다.
답변:
요점은 구문이 훨씬 간단하고 코드가 더 이해하기 쉽다는 것입니다.
예를 들어 Db_Select를 사용하여 my_type
이름 field_foo
이 필드 인 유형의 노드를 원하면 $val
yuoll은 다음과 같이 수행합니다.
$nids = db_select('node', 'n')
->fields('n', array('nid'))
->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
->condition('n.type', 'my_type')
->condition('foo.field_foo_value', $val)
->execute()->fetchCol();
EntityFieldQuery를 사용하면 훨씬 간단합니다.
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
나는 선호한다 주된 이유라고 생각 EntityFieldQuery
이상은 db_select
물건이 데이터베이스에 저장하는 방법 : 당신이 즉, 낮은 수준의 구조에 대해 알 필요가 없다는 것입니다. 이것은 느슨한 결합을 향상시킵니다 .
EntityFieldQuery (EFQ)는 엔티티 ID 만 리턴합니다. 엔티티 데이터에 액세스하려면을 호출해야 entity_load()
합니다. 데이터를로드하는 동안 일반적으로 신경 쓰지 않는 모든 기본 항목 (예 : 필드로드, 다른 모듈 후크 호출 등)이 만들어 졌는지 확인해야합니다 . 물론 이로 인해 두 개의 SQL 쿼리와 많은 오버 헤드가 발생하지만 이는 추상화 비용을 지불하는 것입니다.
EFQ 구문이 더 명확 해지면 개인 취향에 대한 질문이라고 생각합니다. 예를 들어, 나는 EFQ가 더 명확하다고 생각 하지 않습니다 . db_select()
EFQ 로 작동하는 대체품에는 리턴 값 테스트 및 후속 entity_load()
호출이 포함되어야하며 , 이는 코드 IMHO에 많은 노이즈를 추가합니다.
$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
if (!empty($entities['node'])) {
$nodes = entity_load('node', array_keys($entities['node']));
} else {
$nodes = array();
}
따라서 질문에 답하십시오. 엔티티가 모든 기능을 갖추고 있거나 (예 : 필드 가능하거나 다른 모듈에서 사용할 수있는 등) EFQ를 사용하거나 구문이 더 명확하다고 생각되면 EFQ를 사용하십시오. 다른 경우에는를 사용할 수 있습니다 db_select()
.
entity_metadata_wrapper()
여기서 어떻게 도움이 되는지 알지 못한다 . 여전히 엔티티를로드해야합니다.
EntityFieldQuery 는보다 제한적 db_select()
이므로 db_select()
충분히 읽을 수 있고 융통성이있는 사용하지 않는 좋은 이유가 있습니다 (바트 답변 참조).
예를 들어 innerJoin 을 entityFieldQuery
사용 하여 필드를 가져옵니다. 당신이 어떤 이유에 대한 leftJoin 필요한 경우 갇혀있어 ...
http://drupal.org/node/1226622