EntityFieldQuery क्वेरी स्थिति का उपयोग करते समय खाली (नल) क्षेत्रों को छोड़कर


31

क्या उन सभी संस्थाओं का चयन करना संभव है जो xyz फ़ील्ड खाली हैं?

मैंने इस तरह की कोशिश की:

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

हालाँकि, यह काम नहीं करता है।

कोई विचार?

जवाबों:


19

यदि आप फ़ील्डकॉन्डिशन प्रलेखन पृष्ठ को देखते हैं, तो आपको निम्नलिखित चेतावनी दिखाई देगी:

ध्यान दें कि इस पद्धति का उपयोग करते समय रिक्त क्षेत्र मान वाली संस्थाओं को EntityFieldQuery परिणामों से बाहर रखा जाएगा।

यह जाँच करना कि Drupal 8 में unitFieldQuery में कोई फ़ील्ड मौजूद है या नहीं, लेकिन दुर्भाग्य से Drupal 7 में वापस नहीं आएगा

इसे प्राप्त करने के विभिन्न तरीके हैं:

  1. @Clive द्वारा बताए गए टैग और हुक_क्वेरी_TAG_alter का उपयोग करके, उदाहरण के लिए Drupal समस्या पर टिप्पणी 4 देखें ;
  2. पहले सभी गैर-पूर्ण प्रविष्टियों को क्वेरी करें, फिर पिछले वाले को छोड़कर सभी प्रविष्टियों को क्वेरी करें, जैसा कि @ seddonym के उत्तर में और Drupal मुद्दे पर टिप्पणी 5 में वर्णित है ;
  3. आप का उपयोग कर अपने क्वेरी लिख सकते हैं SelectQuery जैसे EntityfieldQuery से Rathen:

_

$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

आप उपयोग कर सकते हैं != NULL, लेकिन आप = NULLकिसी कारण से उपयोग नहीं कर सकते ।

यह मेरा काम है।

  //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

प्रलेखन के अनुसार आप अशक्त और इसनुल का उपयोग कर सकते हैं; इसे लिखने का एक विशिष्ट तरीका है।

$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

संक्षिप्त उत्तर यह है कि सीधे, नहीं, आप नहीं कर सकते (देखें EntityFieldQuery isnull या isNotNull का समर्थन नहीं करता है )। अगर मुझे सही याद है तो यह इस तथ्य का एक साइड-इफ़ेक्ट है जो EntityFieldQueryकेवल INNER JOINs को तालिकाओं में शामिल करने के लिए उपयोग करता है ।

हालाँकि, एक वर्कअराउंड है, जिसमें hook_query_TAG_alter()आपके द्वारा टैग का उपयोग करना और जोड़ना शामिल है EntityFieldQuery, मेरे द्वारा ऊपर दिए गए पृष्ठ पर अंतिम टिप्पणी में एक उदाहरण है।


5

Drupal 7 में, कृपया यहां दिए गए निम्नलिखित वर्कअराउंड की जांच करें :

क्वेरी उदाहरण बदलने के लिए टैग पंजीकृत करें:

<?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');
}
?>

अवलोकन: यह क्वेरी टैग केवल "नोड" इकाई प्रकार के लिए काम करता है। "टैग" शब्दावली से संबंधित "field_tags" को भ्रमित न करें, "श्रेणियाँ" की तरह कोई भी हो सकता है।

EntityFieldQuery का उपयोग करके अभी तक सभी नोड्स को टैग नहीं किया गया है, AddTag () विधि को देखें:

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

अन्य उदाहरण:

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

तब मैंने hook_query_TAG_alterइस तथ्य का लाभ उठाया कि 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');
}

एक और उदाहरण:

<?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();  
  }
?>

नीचे और अधिक पूर्ण उदाहरण जो क्रोन कार्य पर नोड्स का गुच्छा लोड करता है जो कर के संदर्भ को खाली करता है और कुछ परिवर्तन लागू करता है:

/**
 * 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

आपको नल को उद्धरणों में लपेटने की आवश्यकता है।

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

2

कृपया मुझे सुधारें अगर मैं गलत हूं। ऐसा लगता है कि इसे बस होना चाहिए

$query->fieldCondition('field_name');

एक खाली field_nameफ़ील्ड o_O के साथ सभी नोड्स को बाहर करने के लिए

द्रुपाल में परीक्षण किया गया version >= 7.43


जो वास्तव में काम करता है। वे अधिक उत्कीर्ण जवाब मेरे लिए गलत कर रहे थे (यह एक त्रुटि प्रदर्शित करने के लिए नहीं मिल सकता था, लेकिन सब कुछ तोड़ रहा था)।
जोरेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.