Chỉ nhận một số trường với EntityFieldQuery?


19

Drupal 7 có hệ thống truy vấn giống ORM rất hứa hẹn với EntityFieldQuery.

Hiện tại, tôi hiểu cách thực hiện lựa chọn các nút, nhưng kết quả không chứa bất kỳ thông tin cụ thể nào, như các tệp, tôi đang tìm kiếm.

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

Vì vậy, chúng ta cần tải toàn bộ dữ liệu của các nút, nếu chúng ta chỉ muốn nhận các giá trị của một trường, ví dụ 'field_date' trong ví dụ hiện tại.

$nodes = entity_load('node', array_keys($entities['node']));

Nếu có một cách để lấy giá trị của các trường, thay vào đó để tải dữ liệu đầy đủ của tất cả các nút, vì nó gây ra quá tải bộ nhớ.

$nodesFieldDates = ???

Câu trả lời:


10

Câu hỏi tuyệt vời!

EntityFieldQuery thực sự là một thứ tốt, nhưng nếu bạn thực sự muốn nghiêm túc, bạn phải ghi đè lớp trong một mô-đun tùy chỉnh và thêm bất kỳ hành vi nào bạn cần thực hiện trong đó.

Tôi không biết ý định chính xác của bạn, nhưng tôi đã đề cập đến bài viết này về chủ đề này trong quá khứ. Tín dụng cho Neil Hastings cho văn bản viết tốt này.

Tìm kiếm các ví dụ mã một chút vào bài viết cho các ví dụ hay về việc giám sát.

Hy vọng rằng sẽ giúp, mã hóa hạnh phúc!


Ok, tôi hiểu rồi! Vì vậy, có lẽ, có thể định nghĩa lại phương thức "EntityFieldQuery" "buildQuery", để thay thế các trường kết quả. Có lẽ, điều này có thể làm việc.
Fedir RYKHTIK

11

Tôi tìm thấy câu trả lời cho điều này! Mô-đun Solr của Apache mở rộng lớp EntityFieldQuery để thực hiện điều đó. Nó thêm một phương thức mới gọi là addExtraField.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'event')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
  ->fieldOrderBy('field_date', 'value', 'ASC')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Nếu bạn chưa cài đặt Apache Solr, chỉ cần sao chép mã để mở rộng lớp đó.


Tạo một hộp cát cho việc này vì mô-đun Apache Solr có một số nhược điểm drupal.org/sandbox/mikeytown2/2209909
mikeytown2

2
Nâng cấp câu trả lời này chỉ đơn giản cho mô-đun (hiện tại là hộp cát) được tạo bởi mikeytown2 (cảm ơn!)
Oliver Coleman

Liên kết trong câu trả lời dường như không hoạt động. Nó nói "Bạn cần đăng nhập hoặc đăng ký trước khi tiếp tục."
mbomb007



0

Bất cứ ai vẫn muốn nhận Trường từ một EFQ, hãy xem mô-đun Trường bổ sung của EFQ .

Cảnh báo: Mô-đun này lạm dụng EntityFieldQuery để trả về dữ liệu từ cơ sở dữ liệu của bạn. Nó không hoạt động với các thực thể hoặc bất kỳ mô-đun nào xây dựng trên chúng.

Nó cho phép bạn sử dụng addField trong một đối tượng EntityFieldQueryExtraFields (mở rộng các đối tượng EntityFieldQuery). Ban đầu EntityFieldQuery chỉ cung cấp cho bạn trở lại id thực thể, gói và loại thực thể. Mô-đun này thêm một lớp bổ sung trên đó mà không cần thực hiện thêm một số thực thể! Quan trọng nếu bạn muốn làm việc với lượng dữ liệu khổng lồ và bạn muốn giảm các truy vấn sql. Vì EFQ đã truy vấn cơ sở dữ liệu về thông tin này, tại sao không thay đổi truy vấn đó để cung cấp cho bạn một số trường bổ sung. Điều này có nghĩa là không có một truy vấn bổ sung nào sẽ được thực hiện để có được dữ liệu đó.

Một lời cảnh báo, nếu bạn dựa vào một số định dạng sau / tải sau xảy ra trong entity_load hoặc các chức năng tương tự, mô-đun này sẽ không quan tâm đến điều đó. Bạn phải tự đảm bảo tính hợp lệ của dữ liệu được truy xuất.

Thí dụ

Tìm nạp tiêu đề nút

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ('entity_type', 'node')
  -> propertyCondition ('loại', 'my_bundle_type')
  -> propertyCondition ('trạng thái', 1)
  -> addExtraField ('field_myfield', value ', value')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'title', 'title', 'nút')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> thực thi ();
Kết hợp có thể:
addExtraField ($ field_name, $ cột, $ cột_alias = NULL, $ table = NULL)

trường tên
Chỉ định từ trường nào trường thêm sẽ đến. Nếu nó là từ một bảng cơ sở, hãy để trống và điền vào đối số bảng

cột
Chỉ định tên của cột,

cột_alias
Chỉ định bí danh của cột,

bàn
Tùy chọn, thêm một cái gì đó như nút hoặc người dùng ở đây (bảng cơ sở),

Tôi đã thử cả mô-đun này (EFQ Extra Field) và mô-đun (hiện tại là hộp cát) của mikeytown2 và mô-đun sau có vẻ tốt hơn (sử dụng tốt hơn, đầu ra hợp lý hơn) và dường như được duy trì tốt hơn rất nhiều so với trước đây. mô-đun hộp cát mikeytown2 có tại drupal.org/sandbox/mikeytown2/2209909 .
Oliver Coleman
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.