/** * @param Fields $fields * * @return array */ protected function getColumns(Fields $fields) { $newFields = []; foreach ($this->mapping->map() as $objectProperty => $tableColumn) { if (in_array($objectProperty, $fields->get())) { $newFields[$objectProperty] = $tableColumn; } } return $newFields; }
/** * Returns all instances of the type meeting $distinctFields values. * * @param Fields $distinctFields * @param Filter|null $filter * @param Sort|null $sort * * @return array */ public function findByDistinct(Fields $distinctFields, Filter $filter = null, Sort $sort = null) { $model = self::$instance; $query = $model->query(); $columns = count($fields = $distinctFields->get()) > 0 ? $fields : ['*']; if ($filter) { EloquentFilter::filter($query, $filter); } if ($sort) { EloquentSorter::sort($query, $sort); } return $query->getQuery()->distinct()->get($columns); }
/** * @param Fields $distinctFields * @param $results * * @return array * * @throws \Exception */ protected function resultsWithDistinctFieldsOnly(Fields $distinctFields, $results) : array { $newResults = []; $valueHash = []; foreach ($results as $result) { $distinctValues = []; foreach ($distinctFields->get() as $field) { $distinctValues[$field] = PropertyValue::get($result, $field); } $hash = md5(serialize($distinctValues)); if (false === in_array($hash, $valueHash)) { $valueHash[] = $hash; $newResults[] = $result; } } return $newResults; }
/** * {@inheritdoc} */ public function findByDistinct(Fields $distinctFields, Filter $filter = null, Sort $sort = null) : array { $hashFilter = $filter ? serialize($filter->filters()) : ''; $hashSort = $sort ? serialize($sort->orders()) : ''; $hashFields = $distinctFields ? serialize($distinctFields->get()) : ''; $key = $this->cacheNamespaceFindByDistinct . md5($hashFilter . $hashSort . $hashFields); $cachedItem = $this->cache->getItem($key); if ($cachedItem->isHit() && null !== ($result = $cachedItem->get())) { return (array) $result; } $result = $this->repository->findByDistinct($distinctFields, $filter, $sort); $this->saveToCache($cachedItem, $result); return (array) $result; }