【问题标题】:remove duplicate values from entity reference fields从实体引用字段中删除重复值
【发布时间】:2016-12-06 13:39:24
【问题描述】:

当我将提要导入实体引用字段时,它会创建类似于以下代码的重复值(使用 devel 模块)

$field_tags_people['und'][0]['target_id'] = 578
$field_tags_people['und'][1]['target_id'] = 578
$field_tags_people['und'][2]['target_id'] = 594

每个 target_id 应该有不同的值,但结果有些是重复的。我试过这段代码

$field_tags_people['und'] = array_unique($field_tags_people['und'])

但它会删除除第一个之外的所有术语。由于 target_id 键,这看起来很奇怪。我怎样才能做到这一点?

【问题讨论】:

    标签: drupal reference entity drupal-modules drupal-feeds


    【解决方案1】:

    可能有更好的方法来实现这一点,但这里有一个解决方案。

    $unique = [];
    
    $field_tags_people['und'] = array_filter($field_tags_people['und'],
        function ($val) use (&$unique) {
            if (!in_array($val['target_id'],$unique)) {
                $unique[] = $val['target_id'];
                return true;
            }
            return false; 
        }
    );
    
    unset($unique);
    

    这将为您修剪重复项。但请注意,密钥结构不会被重置,因此您可以按 0、1、6、7、10 之类的顺序排列密钥

    干杯

    编辑:在线示例:http://sandbox.onlinephpfunctions.com/code/9b4323a0b07ab8cd46b34a3715ea030f83e0b100

    【讨论】:

      【解决方案2】:

      我通过在自定义模块中实现 hook_feeds_presave 解决了这个问题。

      以下通过键 value 检查 field_my_field_name 数组中的重复项,并在导入/保存节点之前将其删除。

      <?php
      function my_module_feeds_presave(FeedsSource $source, $entity, $item) {
        $items_array = $entity->field_my_field_name[LANGUAGE_NONE];
        $entity->field_my_field_name[LANGUAGE_NONE] = unique_multidim_array($items_array,'value');
      }
      
      function unique_multidim_array($array, $key) {
        $temp_array = array();
        $i = 0;
        $key_array = array();
      
        foreach($array as $val) {
          if (!in_array($val[$key], $key_array)) {
            $key_array[$i] = $val[$key];
            $temp_array[$i] = $val;
          }
          $i++;
        }
        return $temp_array;
      }
      ?>
      

      【讨论】:

        【解决方案3】:
          /**
           * Delete duplicate values.
           *
           * @param \Drupal\Core\Entity\ContentEntityInterface $entity
           *   Entity.
           * @param string $field_name
           *   Field name.
           * @param bool $need_save
           *   Save entity or not.
           *
           * @throws \Drupal\Core\Entity\EntityStorageException
           */
          public static function deleteDuplicateValues(ContentEntityInterface $entity, string $field_name, $need_save = FALSE) {
            $result = [];
            /** @var \Drupal\Core\Field\EntityReferenceFieldItemListInterface $reference_field */
            $reference_field = $entity->get($field_name);
            $referenced_entities = $reference_field->referencedEntities();
            /** @var \Drupal\Core\Entity\ContentEntityInterface $item */
            foreach ($referenced_entities as $item) {
              $result[$item->id()] = $item;
            }
            $entity->set($field_name, $result);
            if ($need_save) {
              $entity->save();
            }
          }
        

        并像这样使用:

        CLASS_NAME::deleteDuplicateValues($entity, 'tags_people');
        

        【讨论】:

          猜你喜欢
          • 2012-03-13
          • 2019-07-09
          • 1970-01-01
          • 2012-09-03
          • 1970-01-01
          • 2013-08-11
          • 1970-01-01
          • 1970-01-01
          • 2021-10-12
          相关资源
          最近更新 更多