EntityFieldQuery INNER THAM GIA


21

Tôi muốn chạy truy vấn bằng cách sử dụng đối tượng EntityFieldQuery. Tôi cần giá trị từ cả bảng node và node_access do đó tôi cần sử dụng INNER THAM GIA. Từ tài liệu làm tôi không thể hiểu làm thế nào điều này là có thể.

Đây là những gì tôi có -

$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
Mặc dù nó không thể được thực hiện nhanh chóng trong Drupal 7, nhưng nó có thể được thực hiện trong Drupal 8 (chưa được phát hành tại thời điểm viết bài này). Xem Truy vấn thực thể có hỗ trợ tham gia để biết chi tiết (bao gồm một ví dụ).
colan

Trong Drupal 8 tất cả các điều kiện là như thế (-> điều kiện ()). Ex của một EFQ trong D8: $ result = \ Drupal :: entityQuery ('nút') -> condition ('type', mảng ('entity_a', 'entity_b'), 'IN') -> condition ('status' , NODE_PUBEDED) -> condition ('field_myfield.value', '5', '=') -> exec (); Trong Drupal 8 EFQ, collumn được xác định trực tiếp trong trường tên bởi field_name.value hoặc field_name.target_id trong drupal 7 là->fieldCondition('field_name', 'target_id', $entities_a, 'IN');
woprrr

Câu trả lời:


30

Bạn không thể thêm các liên kết bổ sung vào EntityFieldQuerytrực tiếp (không được hỗ trợ), nhưng bạn có thể thêm thẻ vào truy vấn, triển khai hook_query_TAG_alter()và thêm liên kết theo cách thủ công khi truy vấn được chuyển đổi thành truy vấn db tiêu chuẩn.

Điều này không được thử nghiệm nhưng có lẽ sẽ giúp bạn đi gần hết:

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

// get the query results as normal

Và sau đó chức năng thay đổi truy vấn:

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

Cách khác để làm điều đó là phân lớp EntityFieldQuerychính nó và thêm phép nối, nhưng tôi nghĩ phương pháp trên đơn giản hơn trong trường hợp này.


Có cách nào tốt hơn để làm điều đó trong một chức năng không? Ngay cả khi nó không phảiEntityFieldQuery
Allan Thomas

2
Không thực sự, cách duy nhất khác là xây dựng truy vấn bằng cách sử dụng thủ công db_select, sau đó bạn có thể có nhiều quyền kiểm soát như bạn muốn
Clive

Tôi sẽ đi với điều đó. Thx
Allan Thomas

@Clive ... oh câu trả lời này thực sự thú vị. Thích nó : P
tenken

2
@Michiel Không EntityFieldQuerythực hiện bất kỳ bộ nhớ đệm nào, nó chỉ bao quanh a SelectQueryvà thêm một số phương thức cho các thực thể. Những phương pháp bổ sung đó làm giảm hiệu suất (rất nhẹ) mà bạn gặp phải khi sử dụng nó thay vì thông thườngSelectQuery
Clive

3

Nếu bạn đang sử dụng các thuộc tính tùy chỉnh với các bảng của riêng mình, phương thức thẻ sẽ không hoạt động. Bạn cần sử dụng các truy vấn con thay thế:

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

Xem Cần tham gia vào EntityFieldQuery, làm thế nào về truy vấn con? để biết chi tiết.


Giải pháp tuyệt vời cho các trường hợp như của tôi, với các bảng tùy chỉnh. Công việc tuyệt vời
Ignacio Segura Postigo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.