Исключение пустых (Null) полей при использовании условия запроса EntityFieldQuery

Можно ли выбрать все сущности, у которых поле xyz пусто?

Я пробовал вот так:

  -> fieldCondition ('field_name', 'value', NULL, 'IS NOT NULL');
 

Однако это не работает.

Любые идеи?

29 голосов | спросил David Barratt 21 MarpmWed, 21 Mar 2012 18:38:20 +04002012-03-21T18:38:20+04:0006 2012, 18:38:20

7 ответов


16

Если вы посмотрите документацию fieldCondition на странице вы увидите следующее предупреждение:

  

Обратите внимание, что сущности с пустыми значениями поля будут исключены из результатов EntityFieldQuery при использовании этого метода.

Проверка наличия или отсутствия поля в entityFieldQuery в Drupal 8 добавлена, но, к сожалению, не будет передан в Drupal 7 .

Существуют различные способы достижения этого:

  1. Используя тег и hook_query_TAG_alter, как указано в @Clive, см. комментарий 4 по проблеме Drupal для примера ;
  2. Сначала запросите все записи без NULL, затем запросите все записи, исключая предыдущие, как описано в ответе @ seddonym, и в комментарий 5 по проблеме Drupal ;
  3. Вы можете написать свой запрос, используя SelectQuery rathen, чем EntityfieldQuery как таковой:

_

  $ q = db_select ('node', 'n');
$ q-> поля ('n', array ('type'))
  -> условие ('n.type', 'my_node_type', '=')
  -> addJoin ('LEFT', 'field_data_field_my_field', 'f', 'f.entity_id = n.nid');
$ Q- & GT; IsNull ( 'f.value');
$ r = $ q-> execute ();
 
ответил Alice Heaton 11 MarpmMon, 11 Mar 2013 18:47:08 +04002013-03-11T18:47:08+04:0006 2013, 18:47:08
13

Вы можете использовать ! = NULL , но по какой-то причине вы не можете использовать = NULL .

Это мое обходное решение.

  //Получить все объекты, у которых есть значения
  $ query = new EntityFieldQuery ();
  $ query-> entityCondition ('entity_type', 'MY_TYPE')
    -> fieldCondition ('field_MY_FIELD', 'value', 'NULL', '! =');
  $ result = $ query-> execute ();

  if (is_array (@ $ result ['registration'])) {
    //Теперь получаем все остальные объекты, которые не находятся в списке, который вы только что получили
    $ query = new EntityFieldQuery ();
    $ query-> entityCondition ('entity_type', 'MY_TYPE')
      -> entityCondition ('entity_id', array_keys ($ result ['MY_TYPE']), 'NOT IN');
    $ result_two = $ query-> execute ();
  }
 
ответил seddonym 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 20:18:53 +0400 2012, 20:18:53
10

В соответствии с документацией вы можете использовать null и isnull; он просто имеет конкретный способ его записи.

  $ query = new EntityFieldQuery ();
$ query-> entityCondition ('entity_type', 'node')
  -> entityCondition ('bundle', 'article')
  -> свойствоCondition ('status', 1)
  -> fieldCondition ('field_news_types', 'value', 'spotlight', '=')
  -> fieldCondition ('field_photo', 'fid', 'NULL', '! =')
  -> fieldCondition ('field_faculty_tag', 'tid', значение $)
  -> fieldCondition ('field_news_publishdate', 'value', $ year. '%', 'like')
  -> диапазон (0, 10)
  -> addMetaData ('account', user_load (1)); //запускаем запрос как пользователь 1

$ result = $ query-> execute ();

if (isset ($ result ['node'])) {
  $ news_items_nids = array_keys ($ result ['node']);
  $ news_items = entity_load ('node', $ news_items_nids);
}
 
ответил giorgio79 3 Maypm12 2012, 15:24:02
9

Короткий ответ заключается в том, что напрямую, нет, вы не можете (см. EntityFieldQuery не поддерживает isNull или isNotNull ). Если я правильно помню, это побочный эффект того, что EntityFieldQuery использует только INNER JOIN s для объединения таблиц.

Существует обходное решение, которое включает в себя использование < code> hook_query_TAG_alter () и добавив тег к вашему EntityFieldQuery , есть пример в последнем комментарии на странице, с которой я связан выше.

ответил Clive 21 MarpmWed, 21 Mar 2012 18:48:59 +04002012-03-21T18:48:59+04:0006 2012, 18:48:59
3

В Drupal 7, пожалуйста, проверьте следующее обходное решение здесь :

  

Зарегистрируйте тег, чтобы изменить экземпляр запроса:

  & л;? PHP
/**
 * Реализует hook_query_TAG_alter ()
 * /
функция MYMODULE_query_node_is_not_tagged_alter (QueryAlterableInterface $ query) {
  $ query-> leftJoin ('field_data_field_tags', 'o', 'node.nid = o.entity_id AND o.entity_type =: entity_type');
  $ Query- & GT; IsNull ( 'o.field_tags_tid');
}
? & GT;
 
  

Обозначение: этот тег запроса изменяется только для типа сущности типа «node».   Не путайте «field_tags», связанные с словарем «Теги», может быть   любые другие подобные «Категории».

     

Получите все узлы, которые еще не отмечены, используя   EntityFieldQuery, посмотрите на метод addTag ():

  & л;? PHP
$ query = new EntityFieldQuery ();
$ query-> entityCondition ('entity_type', 'node')
  -> entityCondition ('bundle', 'news')
  - & GT; addTag ( 'node_is_not_tagged')
  -> propertyCondition ('status', 1);
$ result = $ query-> execute ();
? & GT;
 

Другой пример:

  $ result = $ query
    -> entityCondition ('entity_type', 'node')
    -> свойствоCondition ('type', 'my_content_type')
    -> fieldCondition ('field_mine_one', 'value', '', '& gt;')
    -> fieldCondition ('field_mine_two', 'value', '', '& gt;')
    - & GT; addTag ( 'my_custom_tag')
    - & GT; удален (FALSE)
    -> свойствоOrderBy ('changed', 'DESC')
    -> range (0, $ my_range_value)
    - & GT; выполнение ();
 
  

Затем я реализовал hook_query_TAG_alter , используя тот факт, что    my_custom_tag установлен только мной:

  /**
 * Реализует hook_query_TAG_alter ()
 * /
функция MYMODULE_query_TAG_alter (QueryAlterableInterface $ query) {
  $ query-> leftJoin ('field_data_field_other', 'o', 'node.nid = o.entity_id');
  $ Query- & GT; IsNull ( 'o.field_other_value');
}
 

Другой пример:

  & л;? PHP
  //Получить все объекты, у которых есть значения
  $ query = new EntityFieldQuery ();
  $ query-> entityCondition ('entity_type', 'MY_TYPE')
    -> fieldCondition ('field_MY_FIELD', 'value', 'NULL', '! =');
  $ result = $ query-> execute ();

  if (is_array (@ $ result ['registration'])) {
    //Теперь получаем все остальные объекты, которые не находятся в списке, который вы только что получили
    $ query = new EntityFieldQuery ();
    $ query-> entityCondition ('entity_type', 'MY_TYPE')
      -> entityCondition ('entity_id', array_keys ($ result ['MY_TYPE']), 'NOT IN');
    $ result_two = $ query-> execute ();
  }
? & GT;
 

Более полный пример, ниже которого загружается куча узлов в задаче cron, которая содержит пустой термин таксономии и применяет некоторые изменения:

  /**
 * Реализует hook_cron ().
 * /
функция MYMODULE_cron () {
  $ query = new EntityFieldQuery ();
  $ запрос
    -> entityCondition ('entity_type', 'node')
    -> entityCondition ('bundle', 'property')
    -> свойствоOrderBy ('changed', 'DESC')
    - & GT; addTag ( 'type_is_null')
    - & GT; диапазон (0,50); //Максимум 50.
  $ result = $ query-> execute ();

  if (! empty ($ result ['node'])) {
    $ nids = array_keys ($ result ['node']);
    $ nodes = node_load_multiple ($ nids);

    foreach ($ nodes as $ node) {
      //do_some_stuff ($ node);
    }
  }
}

/**
 * Реализует hook_query_TAG_alter ()
 * /
функция MYMODULE_query_type_is_null_alter (QueryAlterableInterface $ query) {
  $ query-> leftJoin ('field_data_field_foo', 'f', 'node.nid = f.entity_id AND f.entity_type =: entity_type');
  $ Query- & GT; IsNull ( 'f.field_foo_tid'); //Проверяем имя по SQL: DESC field_data_field_foo

  $ query-> leftJoin ('field_data_field_bar', 'b', 'node.nid = b.entity_id AND b.entity_type =: entity_type');
  $ Query- & GT; IsNull ( 'b.field_bar_tid'); //Проверяем имя по SQL: DESC field_data_field_bar
}
 
ответил kenorb 4 +04002013-10-04T15:42:04+04:00312013bEurope/MoscowFri, 04 Oct 2013 15:42:04 +0400 2013, 15:42:04
2

Вам нужно обрезать Null в кавычках.

  -> fieldCondition ('field_name', 'value', 'NULL', '! =');
 
ответил Sharique 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 12 Sep 2013 13:15:19 +0400 2013, 13:15:19
0

Пожалуйста, поправьте меня, если я ошибаюсь. Кажется, что это просто нужно

$ query- & GT; fieldCondition ( 'имя_поля');

, чтобы исключить все узлы с пустым полем field_name o_O

Протестировано в Drupal version> = 7.43 .

ответил leymannx 15 FebruaryEurope/MoscowbWed, 15 Feb 2017 14:11:25 +0300000000pmWed, 15 Feb 2017 14:11:25 +030017 2017, 14:11:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132