#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()
, но вы всегда должны отдавать предпочтение этому решению, которое вводит идентификаторы в конструктор объектов-критериев, так как поведение во время выполнения немного отличается, и использование критериев таким образом должно быть быстрее, чем использование фильтра равенства, из-за внутренних особенностей того, как эти фильтры разрешаются