Каков рекомендуемый способ получить объект Shopware 6 по идентификатору?

#data-access-layer #shopware

Вопрос:

У меня есть идентификатор сущности, и я хочу получить объект сущности через репозиторий, в настоящее время мы это делаем

 $criteria = new Criteria();
    $criteria->addFilter(new EqualsFilter('id', $propertyId));

    $property = $this->propertyGroupOptionRepository->search(
        $criteria,
        $this->context
    )->first();

    if($property) {
        return $property->get('groupId');
    }
 

Есть ли более приятный способ, как find метод Ларавеля?

Ответ №1:

Как вы уже упоминали в своем собственном ответе, вы можете передать идентификаторы в качестве параметра объекту критериев.

Я предлагаю $property = $this->propertyGroupOptionRepository->search(new Criteria([$propertyId]), $context)->first()

Метод поиска не реализован и, я полагаю, никогда не будет реализован, потому что вы можете захотеть загрузить некоторые ассоциации и/или усиления.

Ответ №2:

По крайней мере, можно создать критерий с фильтром идентификаторов без создания фильтра равных.

Ядро shopware делает это так:

 $product = $this->productRepository->search(new Criteria([$productId]), $context)->get($productId);
 

Таким образом, для приведенного выше примера это было бы

 $property = $this->propertyGroupOptionRepository
    ->search(new Criteria([$propertyId]), $context)->get($propertyId);
 

Комментарии:

1. ИМХО, используя first() функцию «приятнее»: $product = $this->productRepository->search(new Criteria([$productId]), $context)->first(); . Но нет эквивалента find функции Ларавеля. Вы должны использовать репозитории и критерии.

2. Да, в функции нет buit find() , но вы всегда должны отдавать предпочтение этому решению, которое вводит идентификаторы в конструктор объектов-критериев, так как поведение во время выполнения немного отличается, и использование критериев таким образом должно быть быстрее, чем использование фильтра равенства, из-за внутренних особенностей того, как эти фильтры разрешаются