Сравните поле ссылки на сущность с одним значением с полем ссылки на сущность с несколькими значениями


Сущность статьи имеет неограниченное справочное поле таксономии с несколькими значениями field_article_countries, ссылающееся на словарь таксономии Countries, а сущность Пользователя имеет справочное поле таксономии с одним значением field_user_countries, которое ссылается на тот же словарь таксономии Countries.

Программно и по сравнению с одной конкретной статьей я хочу загрузить всех пользователей, у которых есть значение field_user_countries = в одно из значений, доступных в справочном поле таксономии с несколькими значениями field_article_countries.

Пример: Скажем, Статья "ABC" имеет field_article_countries со значениями:

  • Париж
  • Испания
  • Лондон
  • Италия

Пользователь "A" имеет field_user_countries значение:

  • Испания

Пользователь "B" имеет field_user_countries значение:

  • Италия

И Пользователь "C" имеет field_user_countries значение:

  • Турция

Я хочу программно и на основе Статья "ABC" , для загрузки только пользователя A и пользователя B.

Ниже приведен мой код:

// Get in array, a list of all "Article Countries" available for the loaded article.
$Article_Countries = $article->field_article_countries->getString();

    // Get Entity Manager to build your query
    $storage = \Drupal::entityTypeManager()
      ->getStorage('user');

    // Get all Users satisfing your conditions
    // For Condition Parameters @See: https://www.drupal.org/docs/8/api/database-api/dynamic-queries/conditions
    $uids = $storage->getQuery()
      ->accessCheck(FALSE)
      //->condition1
      //->condition2
      ->condition('field_user_countries', $Article_Countries, 'IN')
      ->execute();

    // Load all User entities according to their IDs
    $users = \Drupal\user\Entity\User::loadMultiple($uids);

    // Loop through loaded users.  
    foreach ($users as $user) {

    // Do something here.

}

Проблема заключается в том, что загружается только один пользователь, а не все пользователи!

Есть идеи, что не так с моим кодом?

 1
Author: stevekeiretsu, 2020-04-28

1 answers

$Article_Countries = $article->field_article_countries->getString();

Это возвращает строку

->condition('field_user_countries', $Article_Countries, 'IN')

Из документов, condition с помощью IN принимает массив.

Итак, вам нужно, чтобы $Article_Countries был массив идентификаторов сущностей. Моей первой мыслью было $article->field_article_countries->referencedEntities() получить массив объектов, а затем использовать их для создания массива идентификаторов, но это немного обтекаемо. Поэтому я искал более аккуратный способ и нашел это: http://drupal.stackexchange.com/a/207715/89581 что предполагает:

$ids = array_column($entity->field->getValue(), 'target_id');

 2
Author: stevekeiretsu, 2020-04-28 12:19:19