X-Git-Url: https://git.rapsys.eu/airbundle/blobdiff_plain/1d2f3611d73e15020a71b0e65c8e2daf9750b05c..c78d6dd8eeabc90171ef5a84caab2bd04778842e:/Repository/DanceRepository.php?ds=sidebyside diff --git a/Repository/DanceRepository.php b/Repository/DanceRepository.php index 8296ccd..251a1ba 100644 --- a/Repository/DanceRepository.php +++ b/Repository/DanceRepository.php @@ -1,55 +1,272 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ namespace Rapsys\AirBundle\Repository; -use Symfony\Component\Translation\TranslatorInterface; +use Doctrine\ORM\AbstractQuery; use Doctrine\ORM\Query\ResultSetMapping; +use Rapsys\AirBundle\Repository; + /** * DanceRepository */ -class DanceRepository extends \Doctrine\ORM\EntityRepository { +class DanceRepository extends Repository { /** - * Find dances by user id + * Find dances indexed by id * - * @param $id The user id - * @return array The user dances + * @return array The dances + */ + public function findAllIndexed(): array { + //Set the request + $req = <<tableKeys, $this->tableValues, $req); + + //Get result set mapping instance + //XXX: DEBUG: see ../blog.orig/src/Rapsys/BlogBundle/Repository/ArticleRepository.php + $rsm = new ResultSetMapping(); + + //Declare all fields + //XXX: see vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php + //addScalarResult($sqlColName, $resColName, $type = 'string'); + $rsm->addEntityResult('Rapsys\AirBundle\Entity\Dance', 'd') + ->addFieldResult('d', 'id', 'id') + ->addFieldResult('d', 'name', 'name') + ->addFieldResult('d', 'type', 'type') + ->addIndexByColumn('d', 'id'); + + //Return return + return $this->_em + ->createNativeQuery($req, $rsm) + ->getResult(); + } + + /** + * Find dance choices as array + * + * @return array The dance choices + */ + public function findChoicesAsArray(): array { + //Set the request + $req = <<tableKeys, $this->tableValues, $req); + + //Get result set mapping instance + //XXX: DEBUG: see ../blog.orig/src/Rapsys/BlogBundle/Repository/ArticleRepository.php + $rsm = new ResultSetMapping(); + + //Declare all fields + //XXX: see vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php + //addScalarResult($sqlColName, $resColName, $type = 'string'); + $rsm->addScalarResult('name', 'name', 'string') + ->addScalarResult('ids', 'ids', 'string') + ->addScalarResult('types', 'types', 'string') + ->addIndexByScalar('name'); + + //Get result + $result = $this->_em + ->createNativeQuery($req, $rsm) + ->getArrayResult(); + + //Set return + $return = []; + + //Iterate on each name + foreach($result as $name) { + //Set types + $types = []; + + //Explode ids + $name['ids'] = explode("\n", $name['ids']); + + //Explode types + $name['types'] = explode("\n", $name['types']); + + //Iterate on each type + foreach($name['ids'] as $k => $id) { + //Add to types + $types[$this->translator->trans($name['types'][$k]).' ('.$id.')'] = intval($id); + } + + //Add to return + $return[$this->translator->trans($name['name'])] = $types; + } + + //Return return + return $return; + } + + /** + * Find dances ids by nametype + * + * @param array $nametype The nametype filter + * @return array The dance ids */ - public function findByUserId($userId) { - //Get entity manager - $em = $this->getEntityManager(); + public function findIdByNameTypeAsArray(array $nametype): array { + //Set the request + $req = <<getConfiguration()->getQuoteStrategy(); - $dp = $em->getConnection()->getDatabasePlatform(); + //Replace bundle entity name by table name + $req = str_replace($this->tableKeys, $this->tableValues, $req); - //Get quoted table names - //XXX: this allow to make this code table name independent - $tables = [ - 'RapsysAirBundle:UserDance' => $qs->getJoinTableName($em->getClassMetadata('RapsysAirBundle:User')->getAssociationMapping('dances'), $em->getClassMetadata('RapsysAirBundle:User'), $dp), - 'RapsysAirBundle:Dance' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Dance'), $dp) - ]; + //Get result set mapping instance + //XXX: DEBUG: see ../blog.orig/src/Rapsys/BlogBundle/Repository/ArticleRepository.php + $rsm = new ResultSetMapping(); + + //Declare all fields + //XXX: see vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php + //XXX: we don't use a result set as we want to translate group and civility + $rsm->addScalarResult('id', 'id', 'integer'); + //Return result + return $this->_em + ->createNativeQuery($req, $rsm) + ->setParameter('nametype', $nametype) + //XXX: instead of array_column on the result + ->getResult(AbstractQuery::HYDRATE_SCALAR_COLUMN); + } + + /** + * Find dance names as array + * + * @return array The dance names + */ + public function findNamesAsArray(): array { + //Set the request + $req = <<tableKeys, $this->tableValues, $req); + + //Get result set mapping instance + //XXX: DEBUG: see ../blog.orig/src/Rapsys/BlogBundle/Repository/ArticleRepository.php + $rsm = new ResultSetMapping(); + + //Declare all fields + //XXX: see vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php + //addScalarResult($sqlColName, $resColName, $type = 'string'); + $rsm->addScalarResult('name', 'name', 'string') + ->addScalarResult('ids', 'ids', 'string') + ->addScalarResult('types', 'types', 'string') + ->addScalarResult('modified', 'modified', 'datetime') + ->addIndexByScalar('name'); + + //Get result + $result = $this->_em + ->createNativeQuery($req, $rsm) + ->getArrayResult(); + + //Set return + $return = []; + + //Iterate on each name + foreach($result as $name) { + //Set name slug + $slug = $this->slugger->slug($tname = $this->translator->trans($name['name'])); + + //Set types + $types = []; + + //Explode ids + $name['ids'] = explode("\n", $name['ids']); + + //Explode types + $name['types'] = explode("\n", $name['types']); + + //Iterate on each type + foreach($name['ids'] as $k => $id) { + //Add to types + $types[$this->slugger->short($name['types'][$k])] = [ + 'id' => $id, + 'type' => $type = $this->translator->trans($name['types'][$k]), + 'slug' => $stype = $this->slugger->slug($type), + 'link' => $this->router->generate('rapsysair_dance_view', ['id' => $id, 'name' => $slug, 'type' => $stype]) + ]; + } + + //Add to return + $return[$sname = $this->slugger->short($name['name'])] = [ + 'name' => $tname, + 'slug' => $slug, + 'link' => $this->router->generate('rapsysair_dance_name', ['name' => $sname, 'dance' => $slug]), + 'types' => $types, + 'modified' => $name['modified'] + ]; + } + + //Return return + return $return; + } + + /** + * Find dances by user id + * + * @param $id The user id + * @return array The user dances + */ + public function findByUserId($userId): array { //Set the request - $req = 'SELECT d.id, d.title -FROM RapsysAirBundle:UserDance AS ud -JOIN RapsysAirBundle:Dance AS d ON (d.id = ud.dance_id) + $req = 'SELECT d.id, d.name, d.type +FROM Rapsys\AirBundle\Entity\UserDance AS ud +JOIN Rapsys\AirBundle\Entity\Dance AS d ON (d.id = ud.dance_id) WHERE ud.user_id = :uid'; //Replace bundle entity name by table name - $req = str_replace(array_keys($tables), array_values($tables), $req); + $req = str_replace($this->tableKeys, $this->tableValues, $req); //Get result set mapping instance //XXX: DEBUG: see ../blog.orig/src/Rapsys/BlogBundle/Repository/ArticleRepository.php $rsm = new ResultSetMapping(); //Declare result set for our request - $rsm->addEntityResult('RapsysAirBundle:Dance', 'd'); + $rsm->addEntityResult('Rapsys\AirBundle\Entity\Dance', 'd'); $rsm->addFieldResult('d', 'id', 'id'); - $rsm->addFieldResult('d', 'title', 'title'); + $rsm->addFieldResult('d', 'name', 'name'); + $rsm->addFieldResult('d', 'type', 'type'); //Send result - return $em + return $this->_em ->createNativeQuery($req, $rsm) ->setParameter('uid', $userId) ->getResult();