একটি এনটিটিফিল্ডকিয়ারী তৈরি করুন যা রেফারেন্সযুক্ত সত্ত্বাকে নির্বাচন করে


10

আমি টাইপ এ এর ​​সত্তার আইডি সন্ধান করছি এবং আমি সত্ত্বা বি এর উল্লেখ করে আইটি জানি A.

আমি এন্টিফিল্ডকিউয়ারি সম্পর্কে কয়েকটি সুন্দর উত্স পেয়েছি। আমি বিস্মিত হয়েছি যে আমি গুগলে নেট নেট থেকে ফলাফল পাচ্ছি :) :) (এটি কি দ্রুপালের পরিপক্কতার লক্ষণ? :)। তবে এটি সন্ধান করতে পারেনি। সাহায্য করুন ...

কিছু সূত্র:

সত্তা লোডগুলির সাথে এটি দেখতে দেখতে এটিই হ'ল - আপনি বুঝতে পারবেন যে আমার সেই ক্যোয়ারীটি দরকার: র‌্যাপারটি মূলত অনুশীলনের জন্য রয়েছে। লক্ষ্য করুন যে এটি লক্ষ্য সত্তা লোড করে - বেশ কয়েকটি ক্যোয়ারী।

  $b = entity_load('B', array($id));
  $bm = entity_metadata_wrapper('B', $sl[$id]);

  $tsl = $slm->field_sl_tpref->value();
  echo $tsl->id;

1
একটি EntityFieldQueryকেবল সত্ত্বার একটি সেটকে উল্লেখ করতে পারে, এটি দুর্ভাগ্যক্রমে অন্য সত্তার সাথে সম্পর্ক তৈরি করতে পারে না। এটি একবারে কেবল এক ধরণের সত্তাও ফিরিয়ে দিতে পারে তাই আপনি যদি এই সম্পর্কগুলি তৈরি করতে পারেন তবে ফলাফলগুলি বিশ্বাসযোগ্য নয়।
ক্লাইভ

@ ক্লাইভ আপনি উত্তর হিসাবে যুক্ত যোগ করতে চান, তাই আমি এটি নিশ্চিত করতে পারি? ধন্যবাদ :)
মোজিজিস

উত্তর:


15

আপনি উল্লেখযোগ্য সত্তার আইডির ভিত্তিতে সত্তাগুলি পুনরুদ্ধার করার target_idপরিবর্তে ব্যবহার করতে পারেন value:

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', <type-of-the-entity>);
$query->fieldCondition('<name-of-the-field-referring-the-other-entity>', 'target_id', <id-of-the-referenced-entity>, '=');
$results = $query->execute();

ধন্যবাদ, তবে আমি মনে করি না যে আমি যা খুঁজছিলাম ... আমি অন্য দিকটি পাওয়ার চেষ্টা করছিলাম, এইভাবে আপনি এটিকে জানতেন এবং
বিয়ের

2

ভুল, রিলেশন মডিউলটি আপনি যা খুঁজছেন তা কি? এটি X এবং Y সত্ত্বার মধ্যে সম্পর্কের সংজ্ঞা দেওয়ার মতো বলে মনে হচ্ছে যা আপনি করতে চান। সহজেই এই ধরণের তথ্য পেতে এটির নিজস্ব রিলেশনকুইয়ারি (ইএফকিউ এর চারপাশে একটি মোড়ক) এবং রিলেশনকুয়েরি এন্ডপয়েন্ট রয়েছে।


ধন্যবাদ। দুর্ভাগ্যক্রমে আমি অলরেডিরি স্বত্বের সাথে কয়েকটি সম্পর্ক সংজ্ঞায়িত করেছি, সুতরাং সম্পর্কের দিকে স্যুইচিং সমস্যাযুক্ত হবে ... পরবর্তী সময় চেষ্টা করবে :)।
মোজিজিস

2

আমি জানি এটি একটি পুরানো প্রশ্ন তবে গুগল থেকে লোকেরা এটি পেতে আমি বুঝতে পেরেছিলাম যে আমি এখানে আরও একটি পদ্ধতির নিক্ষেপ করব।

উপরের বর্ণনা থেকে সেটআপে 2 সত্তার প্রকার রয়েছে, A এবং B. B রেফারেন্স A সত্তার রেফারেন্স সহ আমি ধরে নিচ্ছি। সুতরাং আপনার কাছে বি এর আইডি থাকলে আপনার ডেটাবেসগুলিতে সঞ্চিত একটি আইডি সহ একটি ক্ষেত্র থাকা উচিত।

কোড নোট:

  • আসল এনআইডি - $original_node->nidএটি বি এর আইডি হবে
  • বান্ডিলের ধরণ - $typeএটি A এর ধরণ হওয়া উচিত
  • ক্ষেত্রের শর্তটি কেবল ক্ষেত্রের সন্ধান করে যা রেফারেন্স ধারণ করে
  • কিভাবে ব্যবহার করতে আরো তথ্যের জন্য EFQ দেখতে এই

কোড

// Start a new EFQ
$query = new EntityFieldQuery();

// Define query, the user load is probably not needed but sometimes is.
$query->entityCondition('entity_type', 'node')
      ->entityCondition('bundle', $type)
      ->fieldCondition('field_NAME_OF_FIELD', 'target_id', $original_node->nid, '=')
      ->addMetaData('account', user_load(1));

// Execute query, result with have node key
$result = $query->execute();

// If results it will be in node key
if (isset($result['node'])) {
  $nids = array_keys($result['node']);
  // This example has multiple nodes being referenced by one node
  $nodes = node_load_multiple($nids, array('type' => $type));
  // Devel module needed
  dpm($nodes);
}

আপনি দ্বিপথের সত্তা রেফারেন্সও সেট আপ করতে পারেন এবং উপরের দিকের দিক থেকে একই কোয়েরি করতে পারেন। সেই উল্লেখগুলি আপ টু ডেট রয়েছে কিনা তা নিশ্চিত করার জন্য আপনি সিইআর এর মতো মডিউল ব্যবহার করতে পারেন । অথবা রেফারেন্সটি আপ টু ডেট রাখার জন্য একটি নিয়ম সেটআপ করুন, আমি উভয়ই ব্যবহার করেছি।


যদি ক্ষেত্রের_NAME_OF_FIELD হয় তবে মাল্টিভ্যালু fieldCondition('field_NAME_OF_FIELD', 'target_id', $original_node->nid, '=')কাজ করবে ? এটি পরিবর্তন করা উচিত fieldCondition('field_NAME_OF_FIELD', 'target_id', array($original_node->nid), 'IN')। মাল্টিভ্যালু ইন্টিরিটিফারেন্স ক্ষেত্রে কীভাবে শর্ত প্রয়োগ করতে হবে সে সম্পর্কে কিছুই খুঁজে পাওয়া যায়নি। যেকোনো পরামর্শ?
কিরণিং করছে

1
আমি এটি একটি পুরানো মন্তব্য জানি কিন্তু আপনি যদি '=' এন্টিফিল্ডকিউরির ডিফল্টগুলি IN ফিল্ডকন্ডিশনে ছেড়ে দেন তবে ('ক্ষেত্রের_সকল_আরএফআইএলডি', 'টার্গেট_আইডি', $ অরিজিনাল_নোড-> নিড) আসলে সেই পরিস্থিতিতে কাজ করবে। আপনি সম্ভবত ইতিমধ্যে জেনে
গেছেন

1

একটি বেশ গতিশীল সমাধান (কিছুটা নোংরা তবে এটি আমার দ্রুত প্রয়োজন) সুতরাং আপনাকে রেফারেন্সিং ফিল্ডের জন্য নামটির হার্ড কোড দেওয়ার দরকার নেই এবং এটি স্বয়ংক্রিয়ভাবে নতুন রেফারেন্সিং ফিল্ডের সাথে পরিচালনা করা হয় আপনি ভবিষ্যতে যুক্ত করবেন:

আপনার কাস্টম মডিউলে:

/**
 * Implement hook_field_create_instance().
 */
function MY_CUSTOM_MODULE_field_create_instance() {
  _MY_CUSTOM_MODULE_set_variable_node_back_references();
}

/**
 * Implement hook_field_delete_field().
 */
function MY_CUSTOM_MODULE_field_delete_field() {
  _MY_CUSTOM_MODULE_set_variable_node_back_references();
}

/**
 * Set Variable node_back_references.
 */
function _MY_CUSTOM_MODULE_set_variable_node_back_references() {
  $field_list = db_select('field_config', 'fc')
    ->fields('fc', array('field_name', 'data'))
    ->condition('fc.data', '%"foreign keys";a:1:{s:4:"node"%', 'like')
    ->condition('fc.deleted', 0);
  $field_list->innerJoin('field_config_instance', 'fci', 'fci.field_name = fc.field_name');
  $field_list->rightJoin('node_type', 'n', 'n.type = fci.bundle');
  $fields = $field_list->execute()->fetchAll();

  $fields_array = array();
  foreach ($fields as $field) {
    $unserialized = unserialize($field->data);
    if (isset($unserialized['settings']['handler_settings']['target_bundles'])) {
      foreach ($unserialized['settings']['handler_settings']['target_bundles'] as $bundle) {
        $fields_array[$bundle][] = $field->field_name;
      }
    }
  }

  variable_set('node_back_references', $fields_array);
}

function _MY_CUSTOM_MODULE_get_referencing_nodes($node) {
  $nids = array();
  $fields = variable_get('node_back_references', array());
  if (isset($fields[$node->type])) {
    foreach ($fields[$node->type] as $field) {
      $query = new \EntityFieldQuery();
      $query->entityCondition('entity_type', 'node');
      $query->propertyCondition('status', 1);
      $query->fieldCondition($field, 'target_id', $node->nid);
      $result = $query->execute();
      $nids = isset($result['node']) ? array_merge(array_keys($result['node']), $nids) : $nids;
    }
    $nodes = (!empty($nids)) ? node_load_multiple($nids) : array();

    return $nodes;
  }

  return $nids;
}

যেখানে আপনার সন্তানের নোড প্রদত্ত পিতামাত নোডগুলি পাওয়া দরকার:

$nodes = _MY_CUSTOM_MODULE_get_referencing_nodes($node);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.