প্রোগ্রামে একটি সত্তার এক ক্ষেত্র থেকে একটি এন্ট্রি মুছুন


13

একটি নির্দিষ্ট সত্তা থেকে বহু-এন্ট্রি ক্ষেত্রের জন্য একটি নির্দিষ্ট ক্ষেত্রের এন্ট্রি প্রোগ্রামগতভাবে মোছার সঠিক উপায় কী? (এটি নির্দিষ্ট ক্ষেত্র এবং নির্দিষ্ট সত্তা, ক্ষেত্রের ধরণ বা উদাহরণ এবং সত্তার প্রকার নয়)

এখানে কিছু সম্ভাবনা যা আমি দেখেছি সেগুলি কার্যকর হয় না:

  • এর সাথে সত্তাটি লোড করা হচ্ছে entity_load(), ফিল্ড এন্ট্রিটিকে = নাল বা = অ্যারে () এ সেট করে, তারপরে সংরক্ষণ করা field_attach_update()। এটি আমার সর্বাধিক সন্ধান পাওয়া গেছে তবে এটি ডাটাবেসে একটি জম্বি নাল ফিল্ড এন্ট্রি ছেড়ে দেয় যা ফর্মটি সংরক্ষণ না হওয়া অবধি ফর্মগুলির মধ্যে ফাঁকা সারি হিসাবে প্রদর্শিত হয় এবং hook_field_is_empty()কিক করতে পারে (এমনটি hook_field_is_empty()কনফিগার করা হয় যে = নাল বা = অ্যারে () কনফিগার করা হবে খালি হিসাবে)।
  • এর সাথে সত্তাটি লোড করা হচ্ছে entity_load(), কী দ্বারা ক্ষেত্রের এন্ট্রিটি সেট না করা, তারপরে সংরক্ষণ করা field_attach_update()। এটি কিছুই করতে পারে না বলে মনে হচ্ছে - দ্রুপাল এন্ট্রিটিকে সংশোধন না করার জন্য সেখানে উপস্থিত থাকার ব্যাখ্যা দিচ্ছে না। (আশ্চর্যজনকভাবে আমি কখনও কখনও এই পদ্ধতির চেষ্টা করার সময় সর্বাধিক ক্যোয়ারির সময়সীমা শেষ করার সময়ও পাই)
  • field_attach_delete() - এটি অনেক বেশি কট্টর: এটি সত্তার জন্য সমস্ত ক্ষেত্রকে হত্যা করে
  • field_purge_data() - ভাল, তবে এখনও খুব ভোঁতা: এটি ক্ষেত্রের সমস্ত এন্ট্রিগুলিকে হত্যা করে, নির্দিষ্ট এন্ট্রিগুলিকে নয়

সুতরাং স্পষ্ট করার জন্য, আমি এমন একটি কোড পেয়েছি যা একটি সত্তা খুঁজে পায় (এবং লোড করে) এমন এক ক্ষেত্র যার একাধিক এন্ট্রি রয়েছে এবং সেই ক্ষেত্রটিতে একটি সুনির্দিষ্ট এন্ট্রি পেয়েছে যা অপসারণ করা দরকার। সত্তার কোনও অন্য এন্ট্রি বা অন্য কোনও ক্ষেত্র স্পর্শ না করে আমি সেই প্রবেশটি সম্পূর্ণরূপে সরাতে চাই।

উত্তর:


24

আপনি যদি সত্তা এপিআই মডিউলের উপর নির্ভর করতে সক্ষম হন তবে আপনার নীচের মতো কোড ব্যবহার করতে সক্ষম হওয়া উচিত:

// Load some entity.
$entity = entity_load_single($entity_type, $id);

// Remove the field value.
unset($entity->field_FIELD_NAME[LANGUAGE_NONE][$index]);

// Reset the array to zero-based sequential keys.
$entity->field_FIELD_NAME[LANGUAGE_NONE] = array_values($entity->field_FIELD_NAME[LANGUAGE_NONE]);

// Save the entity.
entity_save($entity_type, $entity);

2
এই কাজ! ধন্যবাদ, আমার জম্বি সমস্যাটি এখন নষ্ট হয়ে গেছে। কয়েকটি নোট যা অন্যের সময় সাশ্রয় করতে পারে: আমার সত্তা এপিআই আরসি 2 এ আপডেট করা দরকার; যেহেতু আমি একটি গতিশীল ক্ষেত্রের নামটি আনসেট করা লাইনটির জন্য আনসেট ($ সত্তা -> {$ ক্ষেত্রের নাম} [LANGUAGE_NONE] [$ সূচক]) এর মতো প্রয়োজন ব্রেসগুলি ব্যবহার করছি; এবং একটি সতর্কতা এড়াতে আমার অ্যারে_ভ্যালুগুলি () যদি ((খালি (...)) মোড়ানো দরকার ছিল user}
user56reinstatemonica8

এটি কেবলমাত্র যদি পুরো ক্ষেত্রটি পরিষ্কার করতে চান এবং এই ভয়ঙ্কর "সত্যিকারের সীমাবদ্ধতা লঙ্ঘন: 1048 কলাম 'ফিল্ড_ডিউটি_ইউজার_টারজেট_আইডি' বাতিল হতে পারে না" এড়িয়ে চলেছে
ড্যারেল ডুয়েন

অনেক ধন্যবাদ! নোড_লোডের মাধ্যমে ক্ষেত্রের মান পরিবর্তন করার চেষ্টা করেছিল, তবে এটি কার্যকর হয়নি। সুতরাং সত্তা ক্ষেত্রের মান এর মত পরিবর্তন করা অবশ্যই কাজ করে!
Ильин

1

ড্রুপাল 8 মাইগ্রেশন ক্লিনআপের অংশ হিসাবে আমার এটি করা দরকার ছিল।

কিছু পরীক্ষা-নিরীক্ষার পরে, আমি দেখতে পেলাম যে পুনরুক্তি করা এবং তারপরে ডেল্টায় আনসেট () ব্যবহার করা এটি হত্যা করতে পারে। আমার উদাহরণটি একটি ট্যাগ অপসারণ করছে (তাই আমি 'টার্গেট_আইডি' অনুসন্ধান করি, 'মান' নয় যেমন আপনি প্রায়শই অন্যান্য ক্ষেত্রগুলির জন্য চান।

/**
 * Removes a term from a field.
 *
 * @return bool
 *   success
 */
private function removeTerm(\Drupal\node\NodeInterface $object, \Drupal\taxonomy\TermInterface $term, $field_name) {
  // Check if tag value exists already.
  // Remember they may be multiples.
  /** @var @var \Drupal\Core\Field\FieldItemList $field_values */
  $field_values = $object->get($field_name);
  foreach ($field_values as $delta => $field_value) {
    if ($field_value->getValue()['target_id'] == $term->id()) {
      unset($field_values[$delta]);
      return TRUE;
    }
  }
  return FALSE;
}

এবং তারপরে, যদি সাফল্য হয়, তবে $object->save();


0

ড্রুপাল 8 এর জন্য, সত্তা থেকে কোনও ক্ষেত্র মুছতে:

$entity = Node::load($nid);
unset($entity->field_name);

এটি ContentEntityBase থেকে যাদু পদ্ধতিটি__সেট () কল করবে:

public function __unset($name) {
    // Unsetting a field means emptying it.
    if ($this->hasField($name)) {
        $this->get($name)->setValue([]);
    }
    // For non-field properties, unset the internal value.
    else {
        unset($this->values[$name]);
    }
}

এটি ভুলে যাবেন না, আপনার পরিবর্তনগুলি অবিরাম রাখতে আপনাকে কল করা দরকার

$entity->save();

আপনার সমস্ত পরিবর্তনগুলি করার পরে।



-2

বর্তমানের পছন্দসই পদ্ধতিতে সত্তা_মেডাটাটা_আপনার নিয়োগ করবে

$node_wrapped = entity_metadata_wrapper('node', node_load($nid));

unset($node_wrapped->$field_name[$index];

এই EMW সেরা টিউটোরিয়াল আমি দেখা করেছি http://deeson-online.co.uk/labs/programatically-access-field-data-using-entitymetadatawrapper-drupal


এই কাজ করে না। আমি এমনকি ভাগ্য ছাড়াই এটি চেষ্টা করেছিলাম; $ মোড়ক = সত্তা_মেটাডেটা_রাপর ('নোড', $ কর্তব্য); আনসেট ($ মোড়ক-> ফিল্ড_ডিউটি_উজার); $ wrapper-> সংরক্ষণ করুন (); node_save ($ দায়িত্ব);
ড্যারেল ডুয়েন

1
সঠিক উপায়টি হবে $ নোড_ মোড়ানো-> ক্ষেত্রের নাম-> সেট (""); তারপরে $ মোড়ক-> সেভ ()
চ্যাডপ্রেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.