EntityFieldQuery 내부 가입


21

EntityFieldQuery 객체를 사용하여 쿼리를 실행하고 싶습니다. node 및 node_access 테이블의 값이 필요하므로 INNER JOIN을 사용해야합니다. do 문서에서 이것이 어떻게 가능한지 알 수 없습니다.

여기 내가 가진 것이있다.

$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'node_access')
->propertyCondition('type', 'external_link')
->propertyCondition('status', 1)
->fieldCondition('gid', '3', '=')
->fieldCondition('realm', 'domain_id', '=')
->fieldCondition('grant_view', '1', '>=')
->range(0,1)
->execute();

1
Drupal 7에서는 즉석에서 수행 할 수 없지만 Drupal 8에서 수행 할 수 있습니다 (이 문서 작성 시점에 릴리스되지 않음). 세부 사항 (예제 포함)에 대해서는 엔티티 필드 조회에 조인 지원이 있습니다. 를 참조하십시오.
colan

Drupal 8에서 모든 조건은 (-> condition ())과 같습니다. D8의 EFQ 예 : $ result = \ Drupal :: entityQuery ( 'node')-> condition ( 'type', array ( 'entity_a', 'entity_b'), 'IN')-> condition ( 'status' , NODE_PUBLISHED)-> condition ( 'field_myfield.value', '5', '=')-> execute (); 드루팔 8 EFQ에서 collumn 드루팔 7 field_name.value field_name.target_id 또는 이름 필드에 직접 정의된다->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

답변:


30

추가 조인을 EntityFieldQuery직접 추가 할 수는 없지만 (지원되지 않음) 쿼리에 태그를 추가하고 구현 hook_query_TAG_alter()하고 쿼리가 표준 db 쿼리로 변환 될 때 수동으로 조인을 추가 할 수 있습니다.

이것은 테스트되지 않았지만 아마도 대부분의 방법을 얻을 것입니다.

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'node_access')
  // etc
  ->addTag('MYTAG');

// get the query results as normal

그런 다음 쿼리 변경 기능 :

function MYDMOULE_query_MYTAG_alter(QueryAlterableInterface $query) {
  $query->join('node_access', 'node_access', 'node_access.nid = node.nid');
}

다른 방법은 서브 클래스 EntityFieldQuery자체를 만들고 조인을 추가하는 것이지만 위의 방법은이 경우 더 간단하다고 생각합니다.


단일 기능으로 더 나은 방법이 있습니까? 그렇지 않은 경우에도EntityFieldQuery
Allan Thomas

2
실제로 다른 유일한 방법은을 사용하여 수동으로 쿼리를 작성하는 것입니다 db_select. 그러면 원하는만큼 제어 할 수 있습니다.
Clive

내가 갈게 Thx
Allan Thomas

@Clive ... 오이 답변은 정말 흥미 롭습니다. 좋아요 : P
tenken

2
@Michiel No EntityFieldQuery는 캐싱을 수행하지 않으며 a를 감싸고 SelectQuery엔티티에 대한 몇 가지 메소드를 추가합니다. 이러한 추가 방법을 사용하면 일반적인 방식과 비교하여 사용 경험이 약간 (매우 약간) 저하됩니다SelectQuery
Clive

3

자신의 테이블에 사용자 정의 속성을 사용하는 경우 태그 방법이 작동하지 않습니다. 대신 하위 쿼리를 사용해야합니다.

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'user');

$roles_subquery = db_select('users_roles', 'ur');
$roles_subquery->fields('ur', array('uid'));
$roles_subquery->condition('rid', $my_role_id);

$query->propertyCondition('uid', $roles_subquery, 'IN');

EntityFieldQuery에 조인 필요, 하위 쿼리는 어떻습니까?를 참조하십시오 . 자세한 내용은.


맞춤형 테이블을 사용하여 광산과 같은 경우에 탁월한 솔루션입니다. 멋진 일!
이그나시오 세 구라 Postigo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.