পুরো নোড লোড না করে কোনও ক্ষেত্রের মান পুনরুদ্ধার করবেন?


11

আমার অনেকগুলি এনআইডি রয়েছে এবং প্রতিটি নোড থেকে আমার একটি ক্ষেত্রের মান প্রয়োজন। একটি ক্ষেত্রের মান পেতে পুরো নোড লোড করার ওভারহেড এড়ানোর কোনও উপায় আছে কি?

উত্তর:


19

আমি মনে করি না এপিআই-তে কিছু অন্তর্নির্মিত আছে তবে একটি চিম্টিতে আপনি সরাসরি ডাটাবেসটি অনুসন্ধান করতে পারেন:

$entity_type = 'node';
$bundle = 'page';
$nids = array(1, 2, 3);

$field_values = db_select('field_revision_FIELD_NAME', 'f')
  ->fields('f', array('entity_id', 'FIELD_NAME_value'))
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->condition('entity_id', $nids, 'IN')
  ->condition('deleted', 0)
  ->execute()
  ->fetchAllKeyed();

রান করার পরে আপনার নিজের ক্ষেত্রের মানগুলির একটি অ্যারে থাকা উচিত যা তাদের নিজ নিজ নোডের এনআইডি দ্বারা সজ্জিত।

কলামের নামটি মনে রাখা দরকার যে অগত্যা হবে না FIELD_NAME_value; উদাহরণস্বরূপ নোডের রেফারেন্স ফিল্ডের একটি কলামের নাম থাকবে FIELD_NAME_nid। আপনি কোনটি ব্যবহার করবেন তা আপনার ক্ষেত্রের ধরণের উপর নির্ভর করবে।

হালনাগাদ

দেখে মনে হচ্ছে এটিআইপি করার একটি উপায় আছে তবে এটি সুন্দর নয় এবং এখনও একটি ম্যানুয়াল কোয়েরি জড়িত:

// Get the field meta data for the field_id.
$field_name = 'field_something';
$field_info = field_info_field($field_name);
$field_id = $field_info['id'];

// Load up the properties from the node table.
$nids = array(1, 2, 3);
$sql = 'SELECT * FROM {node} WHERE nid IN (:nids)';
$nodes = db_query($sql, array(':nids' => $nids))->fetchAllAssoc('nid');

// Attach the single field to all nodes.
field_attach_load('node', $nodes, FIELD_LOAD_CURRENT, array('field_id' => $field_id));

এই পদ্ধতিটি ডেটা লোড করার জন্য কোনও ফিল্ড আইডি নির্দিষ্ট করে $optionsপ্যারামিটারটির সুবিধা গ্রহণ করে field_attach_load()। দস্তাবেজগুলিতে এটি লক্ষণীয়:

নোট করুন যে ফিরে আসা সত্তাগুলিতে অন্যান্য ক্ষেত্রগুলির জন্য ডেটা থাকতে পারে, উদাহরণস্বরূপ যদি সেগুলি ক্যাশে থেকে পড়ে থাকে।

কোডটি অতিরিক্ত ক্ষেত্রের ডেটা লোড করার জন্য উপস্থিত হতে পারে তবে আপনি যে ক্ষেত্রটি নির্দিষ্ট করেছেন তা ব্যতীত অন্য কিছু ক্যাশে থেকে আসবে।


অসাধারণ. পুরো নোড লোড করার চেয়ে নিখুঁতভাবে কাজ করেছেন এবং অনেক বেশি কাজ করেছেন।
জোরেেন

আমি একক ক্ষেত্রের মান লোড করার জন্য ব্যবহারকারীর সত্তার সাথে এই পদ্ধতির ব্যবহার করেছি তবে এই পদ্ধতিটি ব্যবহারকারীর সাথে সম্পর্কিত সমস্ত ক্ষেত্র (এবং তাদের মানগুলি) লোড করে। আমি কিছু অনুপস্থিত করছি?
WM

সতর্কতা: প্রথম উদাহরণটির জন্য এসকিউএল ডাটাবেসে ক্ষেত্রগুলি সংরক্ষণ করা (ডিফল্ট) প্রয়োজন এবং বিকল্প ক্ষেত্রের স্টোরগুলির সাথে সামঞ্জস্য নয়। দ্বিতীয়টি কাজ করা উচিত (কারণ এটি ফিল্ড_আটাচ_লোড ব্যবহার করে এবং এটি স্টোরেজ বিমূর্তনের সাথে কাজ করবে)।
ববোক

@ ক্লাইভ, আপনি ফিল্ড_ডেটা_এফআইএলডি_NAME এর পরিবর্তে ফিল্ড_রিভিশন_এফআইইএলডি_NAME ব্যবহার করার কোনও কারণ আছে কি? আপনি দয়া করে ব্যাখ্যা করতে পারেন? ধন্যবাদ।
সন্দেশ যাদব

3

আমি অ্যান্টিসিডিশন এবং ফিল্ড সংযুক্তি লোড ব্যবহার করে কিছুটা পরিষ্কার উপায় পাই।

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'story')
  ->propertyCondition('status', 1)
  ->fieldCondition('field_story_image', 'fid', 'NULL', '!=');
$result = $query->execute();

if (isset($result['node'])) {
  $stories = $result['node'];

  // At first we need to get field's id. If you already know field id, you can ommit this step
  // Get all fields attached to a given node type
  $fields = field_info_instances('node', 'story');

  // Get id of body field
  $field_id = $fields['field_story_image']['field_id'];

  // Attach a field of selected id only to get value for it
  field_attach_load('node', $stories, FIELD_LOAD_CURRENT, array('field_id' => $field_id));

  // Get values of our node field
  $output = field_get_items('node', $stories, 'field_story_image');
}

ব্লগ পোস্টটি থেকে http://timonweb.com/loading-only-one-field-from-an-entity-or-node


0

প্রচুর পরিমাণে এনআইডি থাকার পরে একের পর এক নোড লোড করা এড়াতে আপনি ব্যবহার করতে পারেন node_load_multiple()যা একসাথে একাধিক নোড লোড করবে:

node_load_multiple($nids = array(), $conditions = array(), $reset = FALSE)

সাধারণত নোডগুলি লোড করা ক্যাশে হয় এবং এটি দ্রুত হয় যদি আপনি মেমরি ক্যাশে ব্যবহার করেন (যেমন মেমক্যাচ করা হয়) তবে আপনি যদি খুব বেশি মডিউল ইনস্টল করেন তবে (যেমন পাঠাটো ইত্যাদি) ধীর হতে পারে ..

অন্য উপায় হ'ল বিদ্যমান অবজেক্টটি পুনরায় ব্যবহার করা, তাই আপনি এটি সরাসরি ক্যাশে থেকে লোড করতে পারবেন কিনা তা পরীক্ষা করুন (উদাহরণস্বরূপ form_get_cacheএটি ফর্মের অংশ হিসাবে) অথবা $_POSTঅনুরোধ থেকে ।

আরেকটি উপায় হ'ল EntityFieldQueryএকাধিক এনআইডি ব্যবহার করা, যেমন

$query->entityCondition('entity_id', array(17, 21, 422), 'IN')

যা সরাসরি ডাটাবেস থেকে মানগুলি আনবে।

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