엔터티 (예 : 노드) 개체의 필드 값에 어떻게 액세스합니까?


63

node_load((int) $nid)완전히 채워진 노드 엔티티를로드합니다. $node->title->value제목을 얻었지만 Drupal 8에서 필드 값에 어떻게 액세스합니까?

답변:


89

$entity배열 로 변환 할 필요가 없다고 생각합니다 . 이것은 간단하게 작동합니다.

$entity->get('field_name')->getValue();

참고 : 모듈 kint()에서 devel_kint사용하면 객체 요소에 액세스하는 데 사용할 수있는 모든 사용 가능한 방법을 알 수 있으므로 비교적 var_dump()유용하지 않습니다.


14
실제로 다음과 같아야합니다. $ entity-> get ( 'field_name')-> value;
Ed Hollinghurst

1
왜 이것이 @EdHollinghurst인지 아십니까? getValue는 실제로 나에게 오류가 있지만 (dpm 사용) 사용 가능한 메소드에 나열되지만 'value'는 그렇지 않습니다.
autopoietic

2
getValue()나를 위해 작동합니다 (8.1.x 및 8.2.x에서 모두) api 참조 참조
leon.nk

16
->getValue()일반적이며 필드 유형에 관계없이 작동합니다. 을 사용 ->value하면 필드 값이 value속성에 저장된 경우에만 작동합니다 . 더 복잡한 유형 (예 : 날짜 또는 엔터티 참조)에는 작동하지 않습니다.
Pierre Buyle

4
엔터티에 "field_name"이라는 필드가없는 경우이 코드만으로 오류가 발생합니다. 이 코드가 필드가 존재한다는 것을 알고있는 엔티티에서만 실행되는지 확인하십시오. $ entity-> hasField ( 'field_name')을 사용하여 테스트하거나 ((empty ($ entity-> field_name))
oknate

56

drupal 8에서 $ node는 class node입니다.

 $node->field_machine_name->getValue();

또는

$node->get('field_machine_name')->getValue();

값의 배열을 반환합니다.

하나만 기대하면 다음과 같이 배열을 문자열 화 할 수 있습니다.

$node->field_machine_name->getString();

또는

 $node->get('field_machine_name')->getString();

"get"(문자열 및 값) "it"은 없습니다. 이 답변을 설명하기 위해 더 자세한 내용을 추가해 주시겠습니까? 참고 : 그렇게하지 않으면 귀하의 답변이 중재를 통해 삭제 될 위험에 처하게됩니다 (죄송합니다 ...)
Pierre.Vriens

34

필드의 $node->body->value경우 예를 들어 사용할 수 있어야합니다 . 필드 이름을 모르는 경우 Drupal 8 용 Devel 모듈을 설치하고 like를 통해 노드를 검사하는 것이 좋습니다 dsm($node).


1
그러면 어떻게 그 필드를 렌더링합니까?
Alex

1
이것은 구식 인 것 같습니다
Alex

1
@Alex 문제가있는 새로운 질문을 제안합니다. 이것이 정답이었을 때,이 페이지보다 더 많은 답을 가지고있는이 페이지의 답인 지금 답을 편집하는 것은 헛된 것 같습니다.
tenken

5
좋은 설명은 이 기사 를 확인하십시오 . $ node-> field_name-> value를 사용하여 단일 값 (또는 다중 값 필드의 첫 번째 키)을 얻을 수 있습니다. 또는 $ node-> field_name-> getValue ()를 사용하여 필드의 모든 값을 배열로 가져올 수 있습니다.
Mirsoft

2
@tenken : 사실, 새로운 답변으로 중복 질문을 추가하는 것보다 기존 답변을 업데이트하는 것이 좋습니다.
Pierre Buyle

17

$entity->toArray()엔터티에 무엇이 있는지 항상 확인할 수 있습니다 . xdebug (예 : phpstorm)를 사용하더라도 엔티티 객체 자체를 이해하는 것은 매우 어렵습니다. dsm($node)Drupal 8에서 어떤 의미가 있는지 의심 합니다. 브라우저 내 디버깅을 고집한다면 (Dupal 8은 xdebug없이 디버깅하기에는 너무 복잡합니다) dsm($node->toArray())원하는 것입니다.


$ 노드 -> toArray () 드루팔 8. 나를 위해 작동하지 않습니다
악셀 Briche

이를 자세히 설명하는 새로운 질문을 추가하십시오. Drupal\Core\Entity\EntityInterface있다 toArray.

1
이 답변은 해결책을 제공하지 않습니다. downvoting.
colan

이 답변은 반드시이 질문에 대한 직접적인 답변은 아니지만, 훌륭한 기능입니다. 감사.
Stef Van Looveren

14

다음 코드 스 니펫을 사용하여 노드 필드 값을 가져 오십시오.

이것은 URL에서 노드 ID를 얻는 데 사용됩니다

$nid = \Drupal::routeMatch()->getRawParameter($node_id);

nid를 사용하여 노드 데이터를로드하려면

$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);

필드 값을 얻는 데 사용됩니다.

$terms = $node->get('field_Name')->getValue();  

노드 제목을 얻는 데 사용됩니다.

$product_name = $node->getTitle();

2
다음과 같이 노드를로드하십시오. $ nid = \ Drupal :: routeMatch ()-> getRawParameter ( 'node'); $ node = \ Drupal :: entityTypeManager ()-> getStorage ( 'node')-> load ($ nid);
레미

8

나에게 $entity(노드)가있는 것은 효과가 있었다.

$entity->field_name->getValue();

8.1 사용.


2
이것은 다중 값 필드의 모든 값을 배열로 가져옵니다. 물론 단일 값 필드의 값을 얻는 데 사용될 수도 있지만 출력에는 단일 값을 가진 배열이 포함됩니다. 필드의 단일 값 (또는 다중 값 필드의 첫 번째 값)을 얻으려면 $ entity-> field_name-> value
Mirsoft

7

사용하는 동안 (실제로 올바른 방법) :

$node = \Drupal\node\Entity\Node::load($nid);
$node->get('nid')->value; // returns a raw value - Node ID

// Following both returns array structure containing value/target id nested value.
$node->get('nid')->value(); 
$node->nid->getValue();


4

간단합니다 :

$node->get('field_name')->getValue()

필드가 엔티티 참조 필드 인 경우 참조 된 엔티티를 얻는 특별한 방법이 있습니다.

대상 ID를 가져 오려면 (첫 번째 요소) :

$entity->get('field_entity_reference')->target_id

로드 된 엔터티를 가져 오려면 (첫 번째 요소) :

$entity->get('field_entity_reference')->entity

->entity필드에서 사용 하면 엔티티를 자동으로로드합니다.

필드에 여러 참조가 포함될 수 있으면 다음과 같이 모두 참조를 가져올 수 있습니다.

$entities = $entity->get('field_entity_reference')->referencedEntities();

그것은 당신에게 엔티티의 배열을 줄 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.