EntityFieldQuery 대 Db_select ()


답변:


11

요점은 구문이 훨씬 간단하고 코드가 더 이해하기 쉽다는 것입니다.

예를 들어 Db_Select를 사용하여 my_type이름 field_foo이 필드 인 유형의 노드를 원하면 $valyuoll은 다음과 같이 수행합니다.

$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();

14

나는 선호한다 주된 이유라고 생각 EntityFieldQuery이상은 db_select물건이 데이터베이스에 저장하는 방법 : 당신이 즉, 낮은 수준의 구조에 대해 알 필요가 없다는 것입니다. 이것은 느슨한 결합을 향상시킵니다 .


6
더 나아가더라도 이것은 정확합니다. 필드 스토리지는 플러그 가능합니다. 기본 구현은 필드 데이터를 데이터베이스의 필드 당 별도의 테이블에 저장하지만 대체 할 수 있습니다. 예를 들어 MongoDB에 필드 데이터를 저장할 수있는 구현이 있습니다. 코드를 이식 가능하고 특정 사이트 구성에서만 작동하도록하려면 EntityFieldQuery를 사용해야합니다.
Berdir

3

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를 사용하여 필요한 항목에만 액세스 할 수 있습니다.
Kevin

나는 entity_metadata_wrapper()여기서 어떻게 도움이 되는지 알지 못한다 . 여전히 엔티티를로드해야합니다.
flaviovs

1

EntityFieldQuery 는보다 제한적 db_select()이므로 db_select()충분히 읽을 수 있고 융통성이있는 사용하지 않는 좋은 이유가 있습니다 (바트 답변 참조).

예를 들어 innerJoinentityFieldQuery사용 하여 필드를 가져옵니다. 당신이 어떤 이유에 대한 leftJoin 필요한 경우 갇혀있어 ... http://drupal.org/node/1226622


글쎄요, 왜 내 대답에 "-1"이 있는지 알고 싶습니다. 예, entityFieldQuery는 더 아름답지만 강력하고 완전한 API 인 db_select보다 덜 효율적입니다 ... 특정 사용 사례에 대해 너무 제한되어 있기 때문에 코드에서 entityFieldQuery를 많이 제거합니다. 확실히 가치가 있다고 생각합니다. 지적했다. 어쨌든.
yann_yinn

1
entityFieldQuery가 다른 스토리지 방법 위의 추상화 계층 인 방법을 인정하지 못하기 때문에 일부는 귀하의 답변을 좋아하지 않는다고 생각합니다. MySQL이 항상 x / y / z의 데이터베이스가되고 필요할 때 더 적은 DB 쿼리를 작성하는 것을 선호한다는 많은 사이트에서 작업하고 있습니다. entityFieldQuery가 db_select보다 더 예쁘지 않습니다. 페이지 상단의 두 비교는 거의 시각적으로 동일합니다.
Charlie Schliesser

그렇기 때문에 제가 "바트 답변보기"를 썼습니다. 이 특별한 유스 케이스를 제외하고 db_select는보다 효율적이고 훨씬 유연합니다.
yann_yinn 2016 년

완전히 동의 해.
Charlie Schliesser 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.