EntityFieldQuery sorgu koşulu kullanılırken boş (boş) alanlar hariç


31

Xyz alanı boş olan tüm varlıkları seçmek mümkün müdür?

Böyle bir şey denedim:

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

Ancak, bu işe görünmüyor.

Herhangi bir fikir?

Yanıtlar:


19

FieldCondition dokümantasyon sayfasına bakarsanız aşağıdaki uyarıyı göreceksiniz:

Boş alan değerleri olan varlıkların, bu yöntemi kullanırken EntityFieldQuery sonuçlarından çıkarılacağını unutmayın.

Bir alanın var olup olmadığını kontrol etmek Drupal 8'deki entityFieldQuery ürününe eklendiyse de maalesef Drupal 7'ye desteklenmeyecektir .

Bunu başarmak için çeşitli yöntemler vardır:

  1. Bir etiket ve @Clive tarafından bahsedildiği gibi hook_query_TAG_alter kullanarak, örneğin Drupal konusu ile ilgili açıklama 4'e bakınız ;
  2. Öncelikle NULL olmayan tüm girişleri sorgula, sonra @ seddonym'in cevabında ve Drupal sayısında 5 yorumunda açıklandığı gibi, önceki olanlar dışındaki tüm girişleri sorgula ;
  3. Sorgunuzu, EntityfieldQuery'den ziyade SelectQuery rathen kullanarak yazabilirsiniz :

_

$q = db_select('node', 'n');
$q->fields('n', array('type'))
  ->condition('n.type', 'my_node_type', '=')
  ->addJoin('LEFT', 'field_data_field_my_field', 'f', 'f.entity_id = n.nid');
$q->isNull('f.value');
$r = $q->execute();

15

Kullanabilirsin != NULL, ama = NULLnedense kullanamazsın .

Bu benim geçici çözümüm.

  //Get all the entities that DO have values
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'MY_TYPE')
    ->fieldCondition('field_MY_FIELD', 'value', 'NULL', '!=');
  $result = $query->execute();

  if (is_array(@$result['registration'])) {
    //Now get all the other entities, that aren't in the list you just retrieved
    $query = new EntityFieldQuery();
    $query->entityCondition('entity_type', 'MY_TYPE')
      ->entityCondition('entity_id', array_keys($result['MY_TYPE']), 'NOT IN');
    $result_two = $query->execute(); 
  }

10

Belgelere göre null ve isnull kullanabilirsiniz; Sadece yazmak için özel bir yol var.

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'article')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_news_types', 'value', 'spotlight', '=')
  ->fieldCondition('field_photo', 'fid', 'NULL', '!=')
  ->fieldCondition('field_faculty_tag', 'tid', $value)
  ->fieldCondition('field_news_publishdate', 'value', $year. '%', 'like')
  ->range(0, 10)
  ->addMetaData('account', user_load(1)); // run the query as user 1

$result = $query->execute();

if (isset($result['node'])) {
  $news_items_nids = array_keys($result['node']);
  $news_items = entity_load('node', $news_items_nids);
}

9

Kısa cevap doğrudan, hayır yapamazsınız (bkz. EntityFieldQuery isNull veya isNotNull'u desteklemiyor ). Eğer doğru hatırlıyorsam, bu tabloları birleştirmek EntityFieldQueryiçin sadece INNER JOINs kullanan gerçeğinin bir yan etkisidir .

Bununla birlikte, hook_query_TAG_alter()bir etiket kullanmak ve kendinize bir etiket eklemek de dahil olmak üzere bir geçici çözüm var, EntityFieldQueryyukarıdan bağlantı verdiğim sayfadaki son yorumda bir örnek var.


5

Drupal 7'de lütfen burada önerilen aşağıdaki geçici çözümü kontrol edin :

Sorgu örneğini değiştirmek için etiketi kaydedin:

<?php
/**
 * Implements hook_query_TAG_alter()
 */
function 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->isNull('o.field_tags_tid');
}
?>

Obs .: Bu sorgu etiketi sadece "düğüm" varlık tipi için çalışıyor. "Etiketler" kelimesiyle ilgili "field_tags" kelimelerini karıştırmayın, "Kategoriler" gibi herhangi bir başka olabilir.

EntityFieldQuery kullanılarak etiketlenmemiş tüm düğümleri henüz etiketlemedi, addTag () yöntemine bakın:

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

Diğer örnek:

  $result = $query
    ->entityCondition('entity_type', 'node')
    ->propertyCondition('type', 'my_content_type')
    ->fieldCondition('field_mine_one', 'value', '', '<>')
    ->fieldCondition('field_mine_two', 'value', '', '<>')
    ->addTag('my_custom_tag')
    ->deleted(FALSE)
    ->propertyOrderBy('changed', 'DESC')
    ->range(0, $my_range_value)
    ->execute();

Sonra sadece benim tarafımdan belirlenen hook_query_TAG_altergerçeği kaldırarak uyguladım my_custom_tag:

/**
 * Implements hook_query_TAG_alter()
 */
function MYMODULE_query_TAG_alter(QueryAlterableInterface $query) {
  $query->leftJoin('field_data_field_other', 'o', 'node.nid = o.entity_id');
  $query->isNull('o.field_other_value');
}

Başka bir örnek:

<?php
  //Get all the entities that DO have values
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'MY_TYPE')
    ->fieldCondition('field_MY_FIELD', 'value', 'NULL', '!=');
  $result = $query->execute();

  if (is_array(@$result['registration'])) {
    //Now get all the other entities, that aren't in the list you just retrieved 
    $query = new EntityFieldQuery();
    $query->entityCondition('entity_type', 'MY_TYPE')
      ->entityCondition('entity_id', array_keys($result['MY_TYPE']), 'NOT IN');
    $result_two = $query->execute();  
  }
?>

Aşağıda taksonominin boşa attığı ve bazı değişikliklerin uygulandığı boş bir düğüm düğümünün cron görevine yüklendiği daha eksiksiz bir örnek verilmiştir:

/**
 * Implements hook_cron().
 */
function MYMODULE_cron() {
  $query = new EntityFieldQuery();
  $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'property')
    ->propertyOrderBy('changed', 'DESC')
    ->addTag('type_is_null')
    ->range(0,50); // Maximum of 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);
    }
  }
}

/**
 * Implements hook_query_TAG_alter()
 */
function 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->isNull('f.field_foo_tid'); // Check name by 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->isNull('b.field_bar_tid'); // Check name by SQL: DESC field_data_field_bar
}

3

Null'u tırnak içine almanız gerekir.

->fieldCondition('field_name', 'value', 'NULL', '!=');

2

Yanılıyorsam lütfen beni düzeltin. Sadece olması gereken görünüyor

$query->fieldCondition('field_name');

boş bir field_namealanı olan tüm düğümleri dışlamak için o_O

Drupal'da test edilmiştir version >= 7.43.


Bu gerçekten işe yarıyor. Daha çok oy alan cevaplar benim için hata veriyordu (bir hata gösteremedi, ancak her şeyi kırıyordu).
Joren
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.