Làm thế nào để tải một nút theo một giá trị trường?


19

Tôi muốn tải một nút nhất định. Tôi không biết id của nút nhưng tôi biết rằng nó có trường băm nhất định là duy nhất và tôi biết hàm băm đó.

Tôi muốn tải nút thông qua trường băm. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


14

Bạn có thể đạt được bằng cách sử dụng EntityFieldQuery.

Đối với D8 EntityFieldQuery đã được viết lại.

Drupal 8:

$query = \Drupal::entityQuery('entity_test');
$default_langcode_group = $query->andConditionGroup()
  ->condition('user_id', $properties[$default_langcode]['user_id'], '=', $default_langcode)
  ->condition('name', $properties[$default_langcode]['name'], '=', $default_langcode);
$langcode_group = $query->andConditionGroup()
  ->condition('name', $properties[$langcode]['name'], '=', $langcode)
  ->condition("$this->field_name.value", $field_value, '=', $langcode);
$result = $query
  ->condition('langcode', $default_langcode)
  ->condition($default_langcode_group)
  ->condition($langcode_group)
  ->sort('name', 'ASC', $default_langcode)
  ->execute();

Làm cách nào để tìm nạp các giá trị của trường thực thể?

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('changed', REQUEST_TIME, '<')
    ->condition('title', 'cat', 'CONTAINS')
    ->condition('field_tags.entity.name', 'cats');

$nids = $query->execute();

Vì vậy, nếu tôi hiểu điều này một cách chính xác, điều này sẽ trả về một loạt các id nút (hoặc một, hoặc không, tùy thuộc vào điều kiện), nhưng tôi vẫn phải sử dụng Node::để tải các nút đã nói, đúng không?
Andrew

vâng bạn đúng
DRUPWAY

31

Cách nhanh nhất để tải một nút cụ thể theo giá trị trường là sử dụng phương thức loadByProperties().

Bạn chỉ định một hoặc nhiều giá trị trường và được trả về là một mảng chứa các nút khớp với các giá trị trường:

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['title' => $title]);

Thông thường bạn lặp qua các nút. Trong trường hợp của bạn, bạn đang tìm kiếm một nút cụ thể. Một nút đơn cũng được trả về trong mảng, vì vậy hãy áp dụng reset()và điều này trả về nút hoặc NULL nếu không tìm thấy gì:

if ($node = reset($nodes)) {
  // found $node that matches the title
}

1
Tôi giả sử trong trường hợp của mình, tôi sẽ không cần phần thứ hai của mã ( $node = reset...) vì bản thân hàm băm là duy nhất.
Andrew

3
Nút đơn vẫn nằm trong một mảng. Bạn có thể sử dụng $ node = $ nút [0], nhưng sau đó bạn sẽ phải kiểm tra xem có nút nào để tránh cảnh báo trong nhật ký lỗi hay không. reset () tốt hơn vì nó âm thầm trả về NULL.
4k4

Không chắc chắn tại sao tất cả các upvote cho điều này; câu hỏi ban đầu là tải một nút theo giá trị trường. Một tài sản (như Tiêu đề) không phải là một lĩnh vực.
Liquidcms

@l Liquidcms, title là trường nút và bạn có thể sử dụng bất kỳ trường nút nào khác. Các trường Drupal BTW có một hoặc nhiều thuộc tính. Nếu là một thuộc tính, Drupal sử dụng hầu hết các lần giá trị tên thuộc tính. Vì vậy, đối với hầu hết các lĩnh vực cả hai điều khoản có thể thay thế cho nhau.
4k4

Xem ví dụ này để truy vấn hai trường khác nhau drupal.stackexchange.com/questions/250306/iêu
4k4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.