เป็นไปได้หรือไม่ที่จะเลือกเอนทิตีทั้งหมดที่มีฟิลด์ xyz ว่างเปล่า?
ฉันลองทุกอย่างเช่นนี้
->fieldCondition('field_name', 'value', NULL, 'IS NOT NULL');
อย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่ทำงาน
ความคิดใด ๆ
เป็นไปได้หรือไม่ที่จะเลือกเอนทิตีทั้งหมดที่มีฟิลด์ xyz ว่างเปล่า?
ฉันลองทุกอย่างเช่นนี้
->fieldCondition('field_name', 'value', NULL, 'IS NOT NULL');
อย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่ทำงาน
ความคิดใด ๆ
คำตอบ:
ถ้าคุณดูที่fieldConditionหน้าเอกสารประกอบคุณจะเห็นคำเตือนต่อไปนี้:
โปรดทราบว่าเอนทิตีที่มีค่าฟิลด์ว่างจะถูกแยกออกจากผลลัพธ์ EntityFieldQuery เมื่อใช้วิธีนี้
ตรวจสอบว่ามีฟิลด์หรือไม่ถูกเพิ่มไปยัง entityFieldQuery ใน Drupal 8 แต่น่าเสียดาย จะไม่ได้รับการ backported 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();
}
ตามเอกสารคุณสามารถใช้ null และ isnull; มันมีวิธีเฉพาะในการเขียน
$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
เพื่อเข้าร่วมตาราง
มีวิธีแก้ไขปัญหาซึ่งเกี่ยวข้องกับการใช้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');
}
?>
Obs: แท็กแบบสอบถามนี้จะเปลี่ยนใช้งานได้กับประเภทเอนทิตี "node" เท่านั้น อย่าสับสน "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();
}
?>
ตัวอย่างที่สมบูรณ์ยิ่งขึ้นด้านล่างซึ่งโหลดโหนดจำนวนมากบนงาน cron ซึ่งการอ้างอิงเทอม taxonomy ที่ว่างเปล่าและใช้การเปลี่ยนแปลงบางอย่าง:
/**
* 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
}
คุณต้องใส่ Null ในเครื่องหมายคำพูด
->fieldCondition('field_name', 'value', 'NULL', '!=');
โปรดแก้ไขฉันหากฉันผิด ดูเหมือนว่ามันจะต้องเป็น
$query->fieldCondition('field_name');
เพื่อแยกโหนดทั้งหมดด้วยค่าว่าง field_name
ฟิลด์ o_O
การทดสอบใน version >= 7.43
Drupal