রেফারেন্সড সত্তার উদাহরণ কীভাবে পাবেন?


35

আমার সাথে ইমেজ ক্ষেত্রের একটি নোড অবজেক্ট রয়েছে field_image। যখন আমি করি

$node
  ->get('field_image')
  ->first()
  ->getValue()

সত্তা অবজেক্টের পরিবর্তে কিছু বৈশিষ্ট্য সহ আমি অ্যারে পাই। অ্যারে দেখতে এমন দেখাচ্ছে:

'target_id' => string '8' (length=1)
'alt' => string '' (length=0)
'title' => string '' (length=0)
'width' => string '587' (length=3)
'height' => string '458' (length=3)
'_loaded' => boolean true
  '_accessCacheability' => 
    object(Drupal\Core\Cache\CacheableMetadata)[1092]
      protected 'cacheContexts' => 
        array (size=0)
          ...
      protected 'cacheTags' => 
        array (size=0)
          ...
      protected 'cacheMaxAge' => int -1

আমাকে কী ফাইল ফাইল সত্তা লোড করতে হবে target_idবা উদাহরণস্বরূপ থেকে স্বয়ংক্রিয়ভাবে রেফারেন্সড সত্তা অবজেক্ট পাওয়ার কোনও উপায় আছে Drupal\image\Plugin\Field\FieldType\ImageItem?

কেন রেফারেন্সড সত্তা গেটারের মাধ্যমে অ্যাক্সেসযোগ্য নয়? এটি অবিলম্বে উপলব্ধ না হলে এটি অলস বোঝা হতে পারে।


one নোড-> পান ('ইমেজফিল্ড') -> প্রথম () -> getTarget () কেবলমাত্র একটি আইটেম থাকলে বা $ নোড-> পান ('চিত্রের ক্ষেত্র') -> রেফারেন্সডেন্টিটিস () ... আসলে এটি সর্বশেষটি যা তোমার দরকার.

@IvanJaros ঠিক নয়: PHP Fatal error: Call to undefined method Drupal\image\Plugin\Field\FieldType\ImageItem::getTarget()। তবে বাস্তবায়িত পদ্ধতিটি বাস্তবায়িত করে এমন ঘটনাগুলির জন্য $node->get('imagefield')->referencedEntities()ধন্যবাদ কাজ করে । সুতরাং আপনার সমাধানটি কেবল আংশিক - এটি তালিকার জন্য কাজ করে তবে একক ক্ষেত্রে নয় single $node->get('imagefield')EntityReferenceFieldItemListreferencedEntities()
সিলিকনমাইন্ড

হ্যাঁ ঠিক, getTarget ক্ষেত্র আইটেম নয়, সত্তা রেফারেন্স ডেটা টাইপ হয়।

উত্তর:


63

রেফারেন্সড সত্তার পথে খুব দীর্ঘ:

// $id = some node ID
// $field = field name for entity reference field
$node = Node::load($id);

/** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $referenceItem */
$referenceItem = $node->get($field)->first();

/** @var \Drupal\Core\Entity\Plugin\DataType\EntityReference $entityReference */
$entityReference = $referenceItem->get('entity');

/** @var \Drupal\Core\Entity\Plugin\DataType\EntityAdapter $entityAdapter */
$entityAdapter = $entityReference->getTarget();

/** @var \Drupal\Core\Entity\EntityInterface $referencedEntity */
$referencedEntity = $entityAdapter->getValue();

// At this point $referencedEntity is the referenced entity object.

অবশ্যই এক এখনও এক মাছ ধরার নৌকা কলের মাধ্যমে এটা পেতে পারি, কিন্তু এখনও, এটা কষ্টকর এবং আমি ভাবছি কেন EntityReferenceItemপদ্ধতি যা রেফারেন্স সত্তা বস্তুর ফিরে আসবে প্রদান করে না।

$referencedEntity = $node
  ->get($field)
  ->first()
  ->get('entity')
  ->getTarget()
  ->getValue()
;

এটি উল্লেখযোগ্য যে সমস্ত রেফারেন্সযুক্ত সত্তার অ্যারে পাওয়া বেশ সহজ:

$node->get($field)->referencedEntities();

এটি কাজ করে কারণ সত্তা রেফারেন্স ক্ষেত্রগুলির জন্য $node->get($field)উদাহরণ EntityReferenceFieldItemListপ্রয়োগ করে যা প্রয়োগ করে referencedEntities()


33

তুমি ব্যবহার করতে পার:

$node->field_image->entity

আপনি যদি প্রথম মান চান


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

6
এটা তোলে হয়তো কোডে দস্তাবেজ হিসেবে রাখার জন্য কঠিন, কিন্তু সেখানে নেই ডকুমেন্টেশন: wizzlern.nl/sites/wizzlern.nl/files/artikel/... । গতিশীল কাঠামোর কারণে, পদ্ধতিগুলি আরও ভালভাবে কাজ করতে পারে না, আপনি কী শ্রেণীর সাথে কাজ করছেন ঠিক যেমনটি সবকিছু একসাথে গতিশীলভাবে তৈরি করা হয়েছে তা আপনি বুঝতে পারবেন না। প্রথমবারের জন্য এটি খুঁজে পেতে খুব কঠিন হতে পারে তবে একবার আপনি এটি করার পরে এটি মনে রাখা যথেষ্ট সহজ।
বেরদির

1
নেই drupal.org/project/agcobcau যা IDEs মধ্যে স্বয়ংক্রিয় সমাপ্তি সঙ্গে আপনাকে সাহায্য করবে
larowlan

11
@ বার্দির আমি বুঝতে পারি যে এটি এখনও খারাপ নকশা। এটি দেখুন: সত্তা $node->get('field_image')->entityফেরত File। তবে $node->get('field_image')->getEntity()পিতামাতার Nodeসত্তা ফেরত ! আমি বুঝতে পারি যে যাদু পদ্ধতিগুলি ব্যবহারযোগ্য হতে পারে তবে তারা বৃহত্তর প্রকল্পগুলিতে পিটা A যদি যাইহোক আমাদের যাদু ব্যবহার করতে উত্সাহিত করা হয় তবে কেন লেখার ইন্টারফেস এবং oo কোডটিকে বিরক্ত করবেন? আপনি লিখেছেন এটি একবারে আপনি স্মরণ করা যথেষ্ট সহজ - আমি একমত নই। একবার আপনি এটি করা শুরু করার পরে, আপনি সত্যিই খারাপ অভ্যাস বিকাশ করবেন যা আপনার কোডটি কম পঠনযোগ্য এবং কম রক্ষণাবেক্ষণযোগ্য করে তুলবে।
সিলিকনমাইন্ড

4
Downvoted। আমি এটি এভাবেই করতাম। তবে সত্ত্বা রেফারেন্সগুলি আগে লোড না করা হলে এটি কখনও কখনও ভাঙ্গবে (ফলাফলটি তাত্ক্ষণিক সত্তার পরিবর্তে টার্গেট_আইডের সাথে একটি অ্যারে হবে)। সিলিকনমাইন্ড দ্বারা বর্ণিত পদ্ধতিটি সমস্ত ক্ষেত্রে সঠিকভাবে পরিচালনা করবে এবং ক্ষেত্রটি খালি না থাকলে সর্বদা একটি তাত্ক্ষণিক সত্তা শ্রেণিতে ফিরে আসবে।
আলেকজান্ডার ভারভিজক

8

আমার জন্য যা কাজ করেছিল তা হ'ল:

$entity_id = $node->get('field_contact')->first()->getValue()['target_id'];

$entity = Node::load($entity_id)->toArray();

অন্যান্য উত্তরগুলি সত্তা ক্ষেত্রের অ্যারে তৈরি করল না আমি আশা করছিলাম


8

রেফারেন্সযুক্ত ক্ষেত্র থেকে কীভাবে সত্তা পাবেন to আমি @ সিলিকনমাইন্ডের সাথে রেফারেন্সপ্রাপ্ত সংস্থাগুলির সাথে একমত হই এটি ক্ষেত্র আইটেম ডেল্টাস দ্বারা সজ্জিত সত্তা অবজেক্টগুলির একটি অ্যারে প্রদান করে।

খুবই সাধারণ:

$node->get('field_name')->referencedEntities();

EntityReferenceFieldItemList :: referencedEntities

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