. */ namespace App\Repository; use App\Entity\Base\AbstractPartsContainingDBElement; use App\Entity\Base\PartsContainingRepositoryInterface; use App\Entity\Parts\Part; use InvalidArgumentException; abstract class AbstractPartsContainingRepository extends StructuralDBElementRepository implements PartsContainingRepositoryInterface { /** * Returns all parts associated with this element. * * @param object $element the element for which the parts should be determined * @param array $order_by The order of the parts. Format ['name' => 'ASC'] * * @return Part[] */ abstract public function getParts(object $element, array $order_by = ['name' => 'ASC']): array; /** * Gets the count of the parts associated with this element. * * @param object $element the element for which the parts should be determined * @return int */ abstract public function getPartsCount(object $element): int; protected function getPartsByField(object $element, array $order_by, string $field_name): array { if (!$element instanceof AbstractPartsContainingDBElement) { throw new InvalidArgumentException('$element must be an instance of AbstractPartContainingDBElement!'); } $repo = $this->getEntityManager()->getRepository(Part::class); return $repo->findBy([$field_name => $element], $order_by); } protected function getPartsCountByField(object $element, string $field_name): int { if (!$element instanceof AbstractPartsContainingDBElement) { throw new InvalidArgumentException('$element must be an instance of AbstractPartContainingDBElement!'); } $repo = $this->getEntityManager()->getRepository(Part::class); return $repo->count([$field_name => $element]); } }