Dlaczego powinienem używać EntityFieldQuery, skoro mogę wykonać tę samą pracę z Db_select (), aby pobrać wartość.
Byłoby lepiej, gdyby ktoś mógł podać przykład, a nie tylko link.
Dlaczego powinienem używać EntityFieldQuery, skoro mogę wykonać tę samą pracę z Db_select (), aby pobrać wartość.
Byłoby lepiej, gdyby ktoś mógł podać przykład, a nie tylko link.
Myślę, że chodzi o to, że składnia jest znacznie prostsza, a kod będzie bardziej zrozumiały.
Na przykład, jeśli chcesz, aby węzły typu my_type
miały pole o nazwie field_foo
o wartości $val
Db_Select, możesz zrobić coś takiego:
$nids = db_select('node', 'n')
->fields('n', array('nid'))
->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
->condition('n.type', 'my_type')
->condition('foo.field_foo_value', $val)
->execute()->fetchCol();
Co jest znacznie prostsze dzięki EntityFieldQuery:
$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'my_type')
->fieldCondition('field_foo', 'value', $val)
->execute();
Myślę, że głównym powodem prefering EntityFieldQuery
na db_select
to, że nie trzeba wiedzieć o strukturze niższego poziomu, innymi słowy: jak rzeczy są przechowywane w bazie danych. Poprawia to luźne połączenie .
EntityFieldQuery (EFQ) zwróci tylko identyfikatory encji. Jeśli chcesz uzyskać dostęp do danych encji, musisz zadzwonić
entity_load()
, co między ładowaniem danych upewni się, że wykonane zostaną wszystkie podstawowe rzeczy, na których zwykle cię nie obchodzi (takie jak ładowanie pól, wywoływanie innych modułów haków itp.) . Oczywiście skutkują to dwoma zapytaniami SQL i dużym obciążeniem, ale jest to cena, jaką trzeba zapłacić za abstrakcję.Jeśli chodzi o bardziej przejrzystą składnię EFQ, myślę, że jest to bardziej kwestia osobistych preferencji. Ja, na przykład, czy nie uważa, że EFQ jest wyraźniejszy. Zauważ, że działający
db_select()
zamiennik z EFQ musi obejmować test wartości zwracanej i kolejneentity_load()
wywołanie, a to dodaje dużo szumu do kodu, IMHO:Tak więc, odpowiadając na twoje pytanie: użyj EFQ, jeśli twoje jednostki są w pełni funkcjonalne (np. Są przystosowalne, mogą być używane przez inne moduły itp.) I / lub uważasz, że ich składnia jest jaśniejsza. W innych przypadkach można użyć
db_select()
.źródło
entity_metadata_wrapper()
tutaj, jak to pomaga. Nadal musisz załadować jednostkę.EntityFieldQuery jest znacznie bardziej ograniczony niż
db_select()
, więc powinieneś mieć naprawdę dobry powód, aby go nie używaćdb_select()
(patrz odpowiedź bart), który jest wystarczająco czytelny i znacznie bardziej elastyczny.Na przykład
entityFieldQuery
użyj wewnętrznego przyłączenia, aby pobrać pola. Jeśli potrzebujesz LeftJoin z jakiegokolwiek powodu, jesteś uwięziony ... http://drupal.org/node/1226622źródło