Как я могу проверить, существует ли значение в моем объекте PersistantCollection? - PullRequest
3 голосов
/ 15 апреля 2019

Мой объект "поля":

array:4 [▼
  0 => Fields {#10900 ▶}
  1 => Fields {#11222 ▶}
  2 => Fields {#11230 ▼
    -id: 8
    -name: "Tier"
    -uuid: "5f60107fe4"
    -productgroup: PersistentCollection {#11231 ▶}
    -options: PersistentCollection {#11233 ▶}
    -template: PersistentCollection {#11235 ▼
      -snapshot: []
      -owner: Fields {#11230}
      -association: array:20 [ …20]
      -em: EntityManager {#4288 …11}
      -backRefFieldName: "fields"
      -typeClass: ClassMetadata {#7714 …}
      -isDirty: false
      #collection: ArrayCollection {#11236 ▼
        -elements: []
      }
      #initialized: true
    }
    -type: Type {#11237 ▶}
    -formatstring: ""
  }
  3 => Fields {#11511 ▶}
]

Я хочу выяснить, существует ли определенный «templateId» в «полях»:

foreach ($fields as $field) {
  $templateId = $field->getTemplate();
  $result = property_exists($templateId, 3);    
}

Результат "ложный", даже если я ожидаю, что он будет правдой.

Список полей сущностей: https://pastebin.com/zcuFi1dE

Шаблон: https://pastebin.com/mVkKFwJr

1 Ответ

4 голосов
/ 15 апреля 2019

Прежде всего

$templateId = $field->getTemplate();

возвращает ArrayCollection of Template (кстати, вы должны переименовать ваше свойство Templates)

Я считаю, что вы хотите проверить, находится ли шаблон в массиве шаблон полей.

Итак, есть два правильных способа сделать это:

Использование содержит метод из Doctrine \ Common \ Collections \ ArrayCollection

Сравнить объект с другим

//First get the proper Template object instead of the id
$template = $entityManager->getRepository(Template::class)->find($templateId);
$templateArray = $field->getTemplate();

//return the boolean you want
$templateArray->contains($template);

Сравнить индексы / ключи:

$templateArray = $field->getTemplate();

//return the boolean you want
$templateArray->containsKey($templateId);

Но в случае, если вы хотите сделать то же самое, но с другим свойством, отличным от идентификатора, вы можете перебрать свой массив:

Сравнить другой атрибут

//In our case, name for example
$hasCustomAttribute=false;
    foreach($field->getTemplate() as $template){
        if($template->getName() == $nameToTest){
            $hasCustomAttribute=true;
        }
    }
...