EntityFieldQuery vs Db_select ()


19

Чому я повинен використовувати EntityFieldQuery, коли я можу виконати ту саму роботу з Db_select (), щоб отримати значення.

Було б краще, якщо хтось може навести приклад, а не лише посилання.

Відповіді:


11

Я думаю, сенс у тому, що синтаксис набагато простіший, а код буде більш зрозумілим.

Наприклад, якщо ви хочете, щоб вузли з типом my_typeмали поле, назване field_fooзі значенням $val, з Db_Select, yuoll зробіть щось на кшталт:

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

Що набагато простіше з EntityFieldQuery:

$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();

14

Я думаю , що головна причина бажана EntityFieldQueryнад db_selectте , що ви не повинні знати про структуру нижнього рівня, іншими словами: як матеріал зберігається в базі даних. Це покращує нещільне з'єднання .


6
Це правильно, хоча йде навіть далі. Польовий накопичувач підключається. Реалізація за замовчуванням зберігає дані поля в окремій таблиці за кожним полем у базі даних, але її можна замінити, є, наприклад, реалізація, яка дозволяє зберігати дані польових даних у MongoDB. Якщо ви хочете, щоб ваш код був портативним, а не працював лише на вашій конкретній конфігурації сайту, ви повинні використовувати EntityFieldQuery.
Бердір

3

EntityFieldQuery (EFQ) повертає лише ідентифікатори об'єкта. Якщо ви хочете отримати доступ до даних юридичних осіб, вам потрібно буде зателефонувати entity_load(), який, крім завантаження даних, переконається, що всі базові речі, які зазвичай не цікавляться (наприклад, завантаження полів, виклик гачків інших модулів тощо), зроблені . Звичайно, це призводить до двох SQL-запитів і багато накладних витрат, але це ціна, яку потрібно заплатити за абстракцію.

Що стосується більш чіткого синтаксису EFQ, я думаю, це набагато більше питання особистих уподобань. Я, наприклад, не думаю, що EFQ зрозуміліше. Зауважте, що робоча db_select()заміна на EFQ повинна включати перевірку зворотного значення та наступний entity_load()виклик, і це додає багато шуму коду, IMHO:

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();
if (!empty($entities['node'])) {
  $nodes = entity_load('node', array_keys($entities['node']));
} else {
  $nodes = array();
}

Отже, відповідаючи на ваше запитання: використовуйте EFQ, якщо ваші сутності мають повнофункціональний характер (наприклад, є наповнюваними, можуть використовуватися іншими модулями тощо) та / або ви думаєте, що його синтаксис зрозуміліший. Якщо інші випадки, можна використовувати db_select().


Не зовсім точно, ви можете використовувати entit_metadata_wrapper і отримувати доступ лише до того, що вам потрібно.
Кевін

Я не бачу, як entity_metadata_wrapper()тут допомагає. Ще потрібно завантажити сутність.
flaviovs

1

EntityFieldQuery набагато обмеженіший db_select(), тому у вас повинен бути справді вагомий привід не використовувати db_select()(див. Відповідь барта), який є читабельним і набагато гнучкішим.

Наприклад, entityFieldQueryвикористовуйте innerJoin для отримання полів. Якщо вам потрібна leftJoin з будь-якої причини, ви потрапили в пастку ... http://drupal.org/node/1226622


Ну, я хотів би знати, чому у мого віщуна був "-1". так, entitFieldQuery гарніший, але менш ефективний, ніж db_select, що дуже приємний, надійний і повний API ... Я вилучаю з мого коду багато мого entuFieldQuery, оскільки він був занадто обмежений для конкретних випадків використання, думаю, що це, безумовно, заслуговує на те, щоб бути зазначив. Все одно.
yann_yinn

1
Я думаю, що деякі не люблять вашу відповідь, тому що вона не може визнати, як entitFieldQuery є шаром абстракції над різними методами зберігання, що є цікавою особливістю. Я працюю на багатьох сайтах, де ми знаємо, що, скажімо, MySQL завжди буде базою даних для x / y / z, і ми також вважаємо за краще писати більш низькі запити, коли нам потрібно. Я не вважаю, що entitFieldQuery буде гарнішим за db_select. 2 порівняння вгорі сторінки майже візуально однакові.
Charlie Schliesser

Так, саме тому я написав "бачити відповідь Барта". За винятком цього спеціального випадку використання, db_select буде більш ефективним та набагато гнучкішим.
yann_yinn

Я повністю згоден.
Чарлі Шліссер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.