2010-06-22 5 views
1

Il y a un moyen d'obtenir les prochains anniversaires en utilisant seulement DQL (Doctrine Query Language)? Je résous le problème en utilisant la fonction SQL DAYOFYEAR mais je pense que ce n'est pas correct car cela ne fonctionne que sur MySQL et si je dois migrer vers MSSQL (par exemple) ça ne marche pas.Prochain anniversaire en utilisant Doctrine

Merci à l'avance.

+0

Que voulez-vous dire par les prochains anniversaires? – Tom

+0

Pour la semaine en cours, obtenez tous les anniversaires de mes clients. Quelque chose comme Facebook fait pour tous les amis. – Juanma

Répondre

1

Vous n'avez pas vraiment besoin de la fonction de MySQL. Utilisez simplement la fonction date de PHP et utilisez le format "z". Citant la documentation PHP:

z -> Le jour de l'année (à partir de 0) -> 0 à 365

Vous pouvez également utiliser strftime avec "% j" (ou quoi que ce soit ce qui vous convient)

0

J'ai trouvé un moyen d'obtenir des anniversaires à venir en utilisant une requête native dans la doctrine. Ceci est une requête rapide et selon http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html Doctrine utilise ResultSetMapping de la même manière en interne lorsque vous créez des requêtes DQL.

Ceci trouve tous les anniversaires pour les 30 prochains jours.

Utilisez cette méthode avec précaution car elle affectera la manière dont l'entité est chargée ultérieurement. Plus tard dans le script, seuls les champs ajoutés au mappage seront chargés pour cette entité. J'ai chargé la liste par ajax (et l'a ajouté à la session)

use Doctrine\ORM\Query\ResultSetMapping; 

$rsm = new ResultSetMapping; 
$rsm->addEntityResult('AppBundle:User', 'u'); 
$rsm->addFieldResult('u', 'id', 'id'); 
$rsm->addFieldResult('u', 'firstname', 'firstname'); 
$rsm->addFieldResult('u', 'lastname', 'lastname'); 
$rsm->addFieldResult('u', 'birthday', 'birthday'); 
$rsm->addFieldResult('u', 'image', 'image'); 
$query = $this->entityManager->createNativeQuery("SELECT * FROM user u 
          WHERE u.enabled = 1 AND DATE_ADD(u.birthday, INTERVAL YEAR(CURDATE())-YEAR(u.birthday) + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(u.birthday),1,0) YEAR) 
          BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY) 
          ORDER BY CONCAT(SUBSTR(u.birthday,6) < SUBSTR(CURDATE(),6), SUBSTR(u.birthday,6)) ASC", $rsm); 


$birthdays = $query->getResult(); 
Questions connexes