엔터티 API의 초보자는 인정하지만 그것을 치료하려고합니다. 다양한 필드가 첨부 된 여러 콘텐츠 유형을 사용하는 사이트에서 작업하고 있습니다. 공상이 아닙니다. 따라서 일련의 항목을 검색하려고 할 때 무지로 데이터베이스를 직접 호출하고 다음과 같은 작업을 수행했습니다.
$query = db_select('node', 'n')->extend('PagerDefault');
$query->fields('n', array('nid'));
$query->condition('n.type', 'my_content_type');
$query->leftJoin('field_data_field_user_role', 'role', 'n.nid = role.entity_id');
$query->condition('role.field_user_role_value', $some_value);
$query->leftJoin('field_data_field_withdrawn_time', 'wt', 'n.nid = wt.entity_id');
$query->condition('wt.field_withdrawn_time_value', 0);
$query->orderBy('n.created', 'desc');
$query->limit(10);
$result = $the_questions->execute()->fetchCol();
(예, 아마도이 줄을 단일 $the_questions->
문 으로 축소 할 수 있습니다. 지금은 pls를 무시하십시오.)
EntityFieldQuery로 이것을 다시 작성하려고 시도합니다.
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_content_type')
->fieldCondition('field_user_role', 'value', $some_value)
->fieldCondition('field_withdrawn_time', 'value', 0)
->propertyOrderBy('created', 'desc')
->pager(10);
$result = $query->execute();
if (isset($result['node'])) {
$result_nids = array_keys($result['node']);
}
else {
$result_nids = array();
}
나에게 원하는 결과를 제공하고 확실히 더 예쁘다.
이제 성능에 대해 궁금합니다. 처음에는 코드의 각 비트를 어리석은 for()
루프에 던져 time()
실행 전후 에 캡처 합니다. 나는 그리 크지 않은 데이터베이스에서 각 버전을 100 번 실행하고 다음과 같은 것을 얻습니다.
- 직접 버전 : 110msec
- EFQ 버전 : 4943msec
테스트를 다시 실행할 때 분명히 다른 결과를 얻지 만 결과는 동일한 야구장에서 일관되게 나타납니다.
Yikes. 내가 여기서 잘못하고 있습니까, 아니면 EFQ를 사용하는 비용입니까? 컨텐츠 유형과 관련하여 특별한 데이터베이스 조정을 수행하지 않았습니다. 이들은 일반적인 양식 기반 방식으로 컨텐츠 유형을 정의하는 것에서 나온 것입니다. 이견있는 사람? EFQ 코드는 확실히 더 깨끗하지만 40 배의 성능 저하를 감당할 수 없다고 생각합니다.
->addTag('node_access')
??). node_access 태그를 사용하여 "직접"쿼리를 다시 실행하면 실행 시간이 훨씬 더 가깝습니다. EFQ의 시간은 이제 직접 접근보다 2 배 정도 더 큽니다. 사람들이 여전히 신경 쓰면 게시 할 수 있습니다). (다음 댓글에 계속 ....)