Uzyskaj tylko niektóre pola z EntityFieldQuery?

19

Drupal 7 ma bardzo obiecujący system zapytań podobny do ORM z EntityFieldQuery.

Obecnie rozumiem, jak dokonać wyboru węzłów, ale wynik nie zawiera żadnych konkretnych informacji, takich jak pliki, których szukam.

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

Musimy więc załadować całe dane węzłów, jeśli chcielibyśmy uzyskać tylko wartości jednego pola, na przykład „data_pola” w bieżącym przykładzie.

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

Jeśli istnieje sposób na uzyskanie wartości pól, zamiast ładowania pełnych danych wszystkich węzłów, ponieważ powoduje to pewne przeciążenie pamięci.

$nodesFieldDates = ???
Fedir RYKHTIK
źródło

Odpowiedzi:

10

Świetne pytanie!

EntityFieldQuery jest naprawdę dobrą rzeczą, ale jeśli naprawdę chcesz zacząć mówić poważnie, musisz przesłonić klasę w niestandardowym module i dodać dowolne zachowanie, które musisz tam wykonać.

Nie znam twoich dokładnych zamiarów, ale w przeszłości odniosłem się do tego artykułu . Podziękowania dla Neila Hastingsa za ten dobrze napisany artykuł.

Poszukaj przykładów kodu w artykule, aby znaleźć dobre przykłady obejścia.

Mam nadzieję, że to pomoże, szczęśliwego kodowania!

stefgosselin
źródło
Dobra, widzę ! Prawdopodobnie możliwe jest ponowne zdefiniowanie metody „EntityFieldQuery” „buildQuery”, aby naprzemiennie uzyskiwać pola. Prawdopodobnie to może zadziałać.
Fedir RYKHTIK,
11

Znalazłem odpowiedź na to! Moduł Apache Solr rozszerza klasę EntityFieldQuery , aby tak się stało. Dodaje nową metodę o nazwie 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();
?>

Jeśli nie masz zainstalowanego Apache Solr, po prostu skopiuj kod rozszerzenia tej klasy.

mikeytown2
źródło
Utworzono piaskownicę, ponieważ moduł Apache Solr miał pewne wady drupal.org/sandbox/mikeytown2/2209909
mikeytown2
2
Przegłosowałem tę odpowiedź po prostu dla modułu (obecnie sandbox) stworzonego przez mikeytown2 (dzięki!)
Oliver Coleman
Link w odpowiedzi wydaje się nie działać. Mówi „Musisz się zalogować lub zarejestrować, aby kontynuować”.
mbomb007
@ mbomb007 github.com/AmazeeLabs/apachesolr_attachments/blob/… Zaktualizowano link
mikeytown2
0

Każdy, kto nadal chce uzyskać Pola z EFQ, może zajrzeć do modułu EFQ Extra Fields .

Ostrzeżenie: ten moduł wykorzystuje EntityFieldQuery do zwracania danych z bazy danych. Nie działa z jednostkami ani żadnymi modułami, które się na nich opierają.

Pozwala na użycie addField w obiekcie EntityFieldQueryExtraFields (rozszerza obiekty EntityFieldQuery). Początkowo EntityFieldQuery zwraca tylko identyfikator encji, pakiet i typ encji. Ten moduł dodaje do tego dodatkową warstwę bez wykonywania dodatkowych ładowań encji! Ważne, jeśli chcesz pracować z ogromną ilością danych i chcesz zmniejszyć liczbę zapytań SQL. Ponieważ EFQ już wysyła zapytanie do bazy danych w celu uzyskania tych informacji, dlaczego nie zmienić tego zapytania, aby uzyskać dodatkowe pola. Oznacza to, że nie zostanie wykonane żadne dodatkowe zapytanie w celu uzyskania tych danych.

Słowo ostrzeżenia, jeśli polegasz na jakimś post-formatowaniu / ładowaniu, które dzieje się w funkcji entity_load lub podobnych funkcjach, ten moduł nie zajmie się tym. Musisz sam upewnić się o ważności odzyskanych danych.

Przykład

Pobieranie tytułu węzła

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition („typ_jednostki”, „węzeł”)
  -> propertyCondition („type”, „my_bundle_type”)
  -> propertyCondition („status”, 1)
  -> addExtraField („field_myfield”, wartość „, wartość”)
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField („”, „tytuł”, „tytuł”, „węzeł”)
  -> fieldCondition („field_myfield”, „value”, „some_value_to_filter_on”, „=”)
  -> execute ();
Możliwe kombinacje:
addExtraField ($ nazwa_pola, $ kolumna, $ column_alias = NULL, $ table = NULL)

Nazwa pola
Określ, z którego pola powinno pochodzić dodatkowe pole. Jeśli pochodzi z tabeli podstawowej, pozostaw ją pustą i wpisz argument tabeli

kolumna
Podaj nazwę kolumny,

kolumna_alias
Podaj alias kolumny,

stół
Opcjonalnie dodaj tutaj coś takiego jak węzeł lub użytkownik (tabela podstawowa),
tenken
źródło
Wypróbowałem zarówno ten moduł (EFQ Extra Fields), jak i moduł (obecnie sandbox) autorstwa mikeytown2, a ten drugi wydawał się znacznie lepszy (ładniejszy w użyciu, bardziej rozsądny wynik), a także wydaje się być utrzymywany znacznie lepiej niż poprzedni. Moduł piaskownicy mikeytown2 znajduje się na stronie drupal.org/sandbox/mikeytown2/2209909 .
Oliver Coleman