Aby uzyskać wartości z encji, istnieją dwa sposoby:
- Użyj
field_get_items
i uzyskaj wartość pola - Użyj
entity_metadata_wrapper
i uzyskaj wartość pola
Chociaż entity_metadata_wrapper
abstrahuje różnice językowe, jego interfejs API jest czasem niezręczny, szczególnie przy korzystaniu z PHP 5.3. Na przykład uzyskanie wartości długiego pola tekstowego zwykle przebiega tą drogą:
$field = $wrapper->field->value();
print $field['safe_value'];
Na szczęście, PHP 5.4 obsługuje tej składni: print $wrapper->field->value()['safe_value'];
.
Ale moje pytanie dotyczy bardziej wydajności. Jak one działają? Czy przeszukują bazę danych za każdym razem, gdy żądają wartości? Czy entity_metadata_wrapper
żąda wszystkiego na raz? ( field_get_item
Bardziej odpowiednie dla pobierania pojedynczej wartości.)
Nie mam dość odwagi, by zanurzyć się głęboko w źródle Drupala.
performance
entities
Florian Margaine
źródło
źródło
field_view_field()
służy do renderowania pola. Funkcja uzyskiwania wartości pola to field_get_items () .field_get_items()
powoduje zerowe obciążenie bazy danych, więc myślę, że to dość otwarta i zamknięta sprawa :)field_get_items()
zerowy narzut bazy danych? Musi gdzieś dostać swoje dane, prawda?entity_metadata_wrapper
działa, pod względem wydajności.field_get_items()
więc narzut już został poniesiony ... to jest trochę uduszona trasa w D7, szczerze mówiącOdpowiedzi:
Krótka odpowiedź: field_get_items () jest bardziej wydajna niż entity_metadata_wrapper ().
Sprawdź kod tych funkcji:
Oba wymagają przekazania elementu, który został już załadowany z bazy danych . Na przykład:
lub, jak już zasugerowałeś:
Oba te przypadki trochę mnie niepokoją z powodu głupiej logiki w próbie uzyskania wartości, która jest już dostępna, ale z pewnością są przydatne w wielu przypadkach.
Możesz po prostu zrobić,
print $node->field_my_field_name[LANGUAGE_NONE][0]['value'];
ale spowoduje to zgłoszenie błędów powiadomienia PHP, jeśli pole nie ma wartości, ponieważ próbujesz uzyskać dostęp do tablic, które mogą nie istnieć (tj[LANGUAGE_NONE][0]['value']
.). Ostatnio często to robię:co jest o wiele czystsze niż robienie:
Jeśli spojrzysz na kod
field_get_items())
, zobaczysz, że nie robi nic więcej niż upewnienie się, że tablica pola zawiera dane w bieżącym języku, a następnie zwraca go. Narzut związany z uruchomieniem tak małej funkcji jest znikomy, ale jeśli naprawdę zależy Ci na wydajności, możesz po prostu sprawdzić, czy dane istnieją, a następnie je wydrukować.Edycja: Ponieważ
field_get_items()
biegifield_language()
byłyby w rzeczywistości większym spadkiem wydajności niż tylko sprawdzanie języka, więc jeśli już wiesz, że istnieje $ byt-> język, możesz po prostu napisać własną funkcję nadrzędną:źródło
$node = node_load(123);
w 1 skrypcie i zrobisz to jeszcze raz w innym miejscu, nie ponosisz narzutu wydajności pełnego obciążenia obiektu i kompilacji - Drupal po prostu przypisuje tej zmiennej kopię istniejącej jednostki. Jeśli chcesz załadować nową kopię, musisz przejść$reset = TRUE
do funkcji ładowania encji. Zobacz także moje zmiany dotyczące super wydajnego narzędzia pobierającego.if (isset($node->field_my_field_name[LANGUAGE_NONE]) && isset($node->field_my_field_name[LANGUAGE_NONE][0])) {
nie jest konieczne,isset($node->field_my_field_name[LANGUAGE_NONE][0]
wystarczy.isset($node->field_my_field_name[LANGUAGE_NONE])
, ponieważ język nie będzie ustawiony na pustym polu? Myślę, że to delta /[0]
jest zbędne.