/** * Transforms an object to a string (id). * * @param Publication|null $publication * @return string */ public function transform($publication) { if (null === $publication) { return ''; } return $publication->getId(); }
/** * Находим рекомендуемые к просмотру публикации * @param Publication $publication * @param bool $includeRestricted * @param int $limit * @return array */ public function findReadAlso($publication, $includeRestricted = false, $limit = 4) { $em = $this->getEntityManager(); $id = $publication->getId(); $publications = array(); $restrictedCategoriesDQL = $includeRestricted ? '' : ' AND c.public = 1'; # получаем идентификаторы тегов публикации foreach ($publication->getSearchTags() as $tag) { $tagIds[] = $tag->getId(); } # берем публикации по этим тегам (до лимита) if (!empty($tagIds)) { $publications = $em->createQuery('SELECT p FROM EvrikaMainBundle:Publication p LEFT JOIN p.searchTags s LEFT JOIN p.category c WHERE s.id IN(:tagIds) AND p.id != :id AND p.enabled = TRUE AND p.created < CURRENT_TIMESTAMP() ' . $restrictedCategoriesDQL . ' GROUP BY p.id' . ' ORDER BY p.created DESC ')->setParameters(array('id' => $id, 'tagIds' => $tagIds))->setMaxResults((int) $limit / 2)->getResult(); } # получаем идентификаторы найденных публикаций, чтоб не повторяться с последующей выборкой $dqlNotIn = ''; if (!empty($publications)) { $publicationIds = []; foreach ($publications as $p) { $publicationIds[] = $p->getId(); } $publicationIdsStr = implode(',', $publicationIds); $dqlNotIn = empty($publicationIds) ? '' : " AND p . id NOT IN({$publicationIdsStr})"; } # получаем идентификаторы специальностей публикации foreach ($publication->getSpecialties() as $specialty) { $specialtyIds[] = $specialty->getId(); } # берем пару последних публикаций по этим специальностям if (!empty($specialtyIds)) { $publicationsBySpecialty = $em->createQuery('SELECT p FROM EvrikaMainBundle:Publication p LEFT JOIN p.specialties s LEFT JOIN p.category c WHERE s.id IN(:specialtyIds) AND p.id != :id AND p.enabled = TRUE AND p.created < CURRENT_TIMESTAMP()' . $dqlNotIn . $restrictedCategoriesDQL . 'GROUP BY p.id ORDER BY p.created DESC')->setParameters(array('id' => $id, 'specialtyIds' => $specialtyIds))->setMaxResults($limit - count($publications))->getResult(); $publications = array_merge($publications, $publicationsBySpecialty); } # если мы до сих пор не собрали нужное количество (limit) - добираем последними публикациями if (count($publications) < $limit) { # получаем идентификаторы найденных публикаций, чтоб не повторяться с последующей выборкой $dqlNotIn = ''; if (!empty($publications)) { $publicationIds = []; foreach ($publications as $p) { $publicationIds[] = $p->getId(); } $publicationIdsStr = implode(',', $publicationIds); $dqlNotIn = empty($publicationIds) ? '' : " AND p . id NOT IN({$publicationIdsStr})"; } $publicationsByDate = $em->createQuery('SELECT p FROM EvrikaMainBundle:Publication p LEFT JOIN p.category c WHERE p.id != :id AND p.id != :id AND p.enabled = TRUE AND p.created < CURRENT_TIMESTAMP() ' . $dqlNotIn . $restrictedCategoriesDQL . ' ORDER BY p.created DESC')->setParameter('id', $id)->setMaxResults($limit - count($publications))->getResult(); $publications = array_merge($publications, $publicationsByDate); } return $publications; }