খালি (নাল) ক্ষেত্রগুলি বাদ দিয়ে যখন এনটিটিফিল্ডকিউয়ের ক্যোয়ারী শর্তটি ব্যবহার করা হচ্ছে


31

Xyz ক্ষেত্রটি খালি খালি রয়েছে এমন সমস্ত সত্তা নির্বাচন করা কি সম্ভব?

আমি এরকম কিছু করার চেষ্টা করেছি:

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

তবে, এটি কাজ করবে বলে মনে হয় না।

কোন ধারনা?

উত্তর:


19

আপনি যদি ক্ষেত্রের শর্তাদি ডকুমেন্টেশন পৃষ্ঠাতে লক্ষ্য করেন তবে নীচের সতর্কতাটি দেখতে পাবেন:

নোট করুন যে এই পদ্ধতিটি ব্যবহার করার সময় খালি ক্ষেত্রের মান সহ সত্তাগুলি সত্তা ফিল্ডকুইয়ের ফলাফল থেকে বাদ দেওয়া হবে।

একটি ক্ষেত্র বিদ্যমান কিনা তা পরীক্ষা করা হচ্ছে দ্রুপাল 8-তে ইন্টিফিল্ডকিউরিতে যুক্ত করা হয়েছে, তবে দুর্ভাগ্যক্রমে ড্রুপাল 7-এ ব্যাকপোর্ট করা হবে না

এটি অর্জনের জন্য বিভিন্ন পদ্ধতি রয়েছে:

  1. @ ক্লাইভ দ্বারা উল্লিখিত একটি ট্যাগ এবং hook_query_TAG_alter ব্যবহার করে, উদাহরণের জন্য দ্রুপাল ইস্যুতে মন্তব্য 4 দেখুন ;
  2. প্রথমে সমস্ত নূনল এন্ট্রি জিজ্ঞাসা করুন, তারপরে পূর্ববর্তীগুলি বাদ দিয়ে সমস্ত এন্ট্রিগুলিকে জিজ্ঞাসা করুন, যেমন @ সিডনামের উত্তর এবং ড্রুপাল ইস্যুতে মন্তব্য 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

সংক্ষিপ্ত উত্তরটি হ'ল সরাসরি, আপনি পারবেন না ( এন্টিফিল্ডকিউরিটি isNull বা isNotNull সমর্থন করে না )। যদি আমি সঠিকভাবে মনে রাখি তবে এটি এইমাত্রার পার্শ্ব-প্রতিক্রিয়া যা EntityFieldQueryকেবল INNER JOINটেবিলগুলিতে যোগদানের জন্য s ব্যবহার করে।

যদিও hook_query_TAG_alter()আপনার কাজের সাথে একটি ট্যাগ ব্যবহার এবং যুক্ত করা জড়িত EntityFieldQueryরয়েছে, তার উপরে একটি পৃষ্ঠা রয়েছে যা আমি উপরে উল্লিখিত পৃষ্ঠায় সর্বশেষ মন্তব্যে আছে।


5

দ্রুপাল In-তে দয়া করে এখানে প্রস্তাবিত নীচের কাজটি পরীক্ষা করুন :

ক্যোরির উদাহরণটি পরিবর্তন করতে ট্যাগটি নিবন্ধ করুন:

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

ওবস: এই কোয়েরি ট্যাগটি কেবলমাত্র "নোড" সত্তার ধরণের জন্য কাজ করে। "ট্যাগ্স" শব্দভাণ্ডারের সাথে সম্পর্কিত "ফিল্ড_ট্যাগগুলি" গুলিয়ে ফেলবেন না, "বিভাগ" এর মতো অন্য কোনও হতে পারে।

সেখান থেকে সমস্ত নোড এন্টিফিল্ডকুরি ব্যবহার করে এখনও ট্যাগ করা হয়নি, অ্যাডট্যাগ () পদ্ধতিটি দেখুন:

<?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মাঠের সাথে সমস্ত নোড বাদ দিতে _

দ্রুপালে পরীক্ষিত version >= 7.43


এটি আসলে কাজ করে। তারা আরও উচ্চতর উত্তর আমার জন্য ত্রুটিযুক্ত ছিল (এটি একটি ত্রুটি প্রদর্শন করার জন্য এটি পেতে পারে না, তবে সবকিছু ভেঙে দিচ্ছিল)।
জোরেেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.