संदर्भित इकाई का उदाहरण कैसे प्राप्त करें?


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?

क्यों संदर्भित इकाई गटर के माध्यम से सुलभ नहीं है? यदि यह तुरंत उपलब्ध नहीं है तो यह आलसी हो सकता है।


$ नोड-> ('इमेजफ़ील्ड') -> पहला () -> getTarget () यदि केवल एक आइटम या $ नोड है-> मिलता है ('इमेजफ़ील्ड') -> संदर्भित वाक्य () ... वास्तव में वह अंतिम एक है आप सभी की जरूरत।

@ इवानराज बिल्कुल नहीं PHP Fatal error: Call to undefined method Drupal\image\Plugin\Field\FieldType\ImageItem::getTarget():। हालाँकि, $node->get('imagefield')->referencedEntities()इस तथ्य के $node->get('imagefield')उदाहरण के लिए काम करता है कि EntityReferenceFieldItemListकिस referencedEntities()विधि का उदाहरण है । तो आपका समाधान केवल आंशिक है - यह सूचियों के लिए काम करता है लेकिन एकल क्षेत्रों के लिए नहीं।
सिलिकॉनमाइंड

हाँ ठीक है, 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 में ऑटो पूरा करने में मदद करेगा
23

11
@ बर्डिर मैं समझता हूं कि, हालांकि यह अभी भी खराब डिजाइन है। इसे देखें: $node->get('field_image')->entityरिटर्न Fileइकाई। हालाँकि, $node->get('field_image')->getEntity()मूल Nodeइकाई लौटाता है ! मैं समझता हूं कि जादू के तरीके प्रयोग करने योग्य हो सकते हैं, लेकिन वे बड़ी परियोजनाओं में पीआईटीए हैं। अगर हमें जादू का उपयोग करने के लिए प्रोत्साहित किया जाता है, तो इंटरफेस और ओओ कोड लिखने से क्यों परेशान होते हैं? आपने लिखा कि एक बार याद करने के लिए यह काफी आसान है - मैं असहमत हूं। एक बार जब आप ऐसा करना शुरू करते हैं, तो आप वास्तव में बुरी आदत विकसित करेंगे जो आपके कोड को कम पठनीय और कम बनाए रखने योग्य बना देगा।
सिलिकॉनमाइंड

4
Downvoted। मैं इसे इस तरह से करता था। हालांकि यह कभी-कभी टूट जाएगा यदि इकाई संदर्भ पहले लोड नहीं किया गया है (परिणाम एक तात्कालिक इकाई के बजाय target_id के साथ एक सरणी होगा)। सिलिकॉनमाइंड द्वारा उल्लिखित विधि सभी मामलों को ठीक से संभाल लेगी और यदि क्षेत्र खाली नहीं है तो हमेशा एक त्वरित इकाई वर्ग लौटाएगा।
अलेक्जेंडर वरविज्क

8

मेरे लिए क्या काम था:

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

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

अन्य जवाब मैं उम्मीद कर रहा था इकाई क्षेत्र सरणी का उत्पादन नहीं किया


8

संदर्भित क्षेत्र से इकाई कैसे प्राप्त करें। Im संदर्भों के बारे में @SiliconMind के साथ सहमत हूं, यह फ़ील्ड आइटम डेल्टास द्वारा की गई इकाई ऑब्जेक्ट की एक सरणी लौटाता है।

बहुत अासान:

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

EntityReferenceFieldItemList :: referencedEntities

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.