क्या उन सभी संस्थाओं का चयन करना संभव है जो xyz फ़ील्ड खाली हैं?
मैंने इस तरह की कोशिश की:
->fieldCondition('field_name', 'value', NULL, 'IS NOT NULL');
हालाँकि, यह काम नहीं करता है।
कोई विचार?
क्या उन सभी संस्थाओं का चयन करना संभव है जो xyz फ़ील्ड खाली हैं?
मैंने इस तरह की कोशिश की:
->fieldCondition('field_name', 'value', NULL, 'IS NOT NULL');
हालाँकि, यह काम नहीं करता है।
कोई विचार?
जवाबों:
यदि आप फ़ील्डकॉन्डिशन प्रलेखन पृष्ठ को देखते हैं, तो आपको निम्नलिखित चेतावनी दिखाई देगी:
ध्यान दें कि इस पद्धति का उपयोग करते समय रिक्त क्षेत्र मान वाली संस्थाओं को EntityFieldQuery परिणामों से बाहर रखा जाएगा।
यह जाँच करना कि Drupal 8 में unitFieldQuery में कोई फ़ील्ड मौजूद है या नहीं, लेकिन दुर्भाग्य से Drupal 7 में वापस नहीं आएगा ।
इसे प्राप्त करने के विभिन्न तरीके हैं:
_
$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();
आप उपयोग कर सकते हैं != 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();
}
प्रलेखन के अनुसार आप अशक्त और इसनुल का उपयोग कर सकते हैं; इसे लिखने का एक विशिष्ट तरीका है।
$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);
}
संक्षिप्त उत्तर यह है कि सीधे, नहीं, आप नहीं कर सकते (देखें EntityFieldQuery isnull या isNotNull का समर्थन नहीं करता है )। अगर मुझे सही याद है तो यह इस तथ्य का एक साइड-इफ़ेक्ट है जो EntityFieldQuery
केवल INNER JOIN
s को तालिकाओं में शामिल करने के लिए उपयोग करता है ।
हालाँकि, एक वर्कअराउंड है, जिसमें hook_query_TAG_alter()
आपके द्वारा टैग का उपयोग करना और जोड़ना शामिल है EntityFieldQuery
, मेरे द्वारा ऊपर दिए गए पृष्ठ पर अंतिम टिप्पणी में एक उदाहरण है।
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
}
कृपया मुझे सुधारें अगर मैं गलत हूं। ऐसा लगता है कि इसे बस होना चाहिए
$query->fieldCondition('field_name');
एक खाली field_name
फ़ील्ड o_O के साथ सभी नोड्स को बाहर करने के लिए
द्रुपाल में परीक्षण किया गया version >= 7.43
।