Appel de méthode Repository [synfony2]

Bonjour,

J'essaye d'appeler cette methode depuis repository dans mon SubscriberController mais je n'arrive pas. pouvez-s s'il vous plait m'aider.

// Depuis un repository
public function myFindAllDQL()
{
  $query = $this->_em->createQuery('SELECT s FROM SecureUserBundle:Subscriber s');
  $results = $query->getResult();

  return $results;
}

dans SubscriberController je fais ceci :

    // On récupère le repository
    $oSubscriberRep = $this->getDoctrine()
                        ->getEntityManager()
                        ->getRepository('SecureUserBundle:Subscriber');
                        ->myFindAllDQL();

et j'ai cette erreur :

Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in /var/www/html/dossier/.../Bundle/AdminBundle/Controller/SubscriberController.php on line 113

Étantdebutant dans synfony2, que dois je rajouter dans les namespace et use pôur que cela ca marche.

Merci.

5 réponses


Bonsoir.
Tu as laissé un ; après le getRepository dans le code que tu nous montre de ton SubscriberController, c'est pour cela que tu as cette erreur.
Donc, commences par corriger ceci et si ton problème persiste, reviens nous donner l'erreur qui te sera retourné, sinon tu pourras marquer ton sujet comme résolu.

J'ai enlever le ; je vous montre mon code car une erreur est survenu pour la ligne qui succède

    // On récupère le repository
    $oSubscriberRep = $this->getDoctrine()
                        ->getEntityManager()
                        ->getRepository('SecureUserBundle:Subscriber')
                        ->myFindAllDQL();

     // On récupère les subscribers
    $aSubscribers   = $oSubscriberRep->advancedSearchCriteria('s', $searchCriteria, array('s.created_at' => 'DESC'), 's.id');

    L'erreur est : 

Fatal error: Call to a member function advancedSearchCriteria() on a non-object in /var/www/html/mapinfo/src/Secure/Bundle/AdminBundle/Controller/StatisticSubscriberController.php on line 116

Mon objectif est de réaliser une requete avec des jointure dans le repository, car la fonction myFindAllDQL() c'est moi qui l'a ajouté, après je souhaite la modifier pour qu'elle contienne des jointure.

Le code initaiale était seulement çà :

    // On récupère le repository
    $oSubscriberRep = $this->getDoctrine()
                        ->getEntityManager()
                        ->getRepository('SecureUserBundle:Subscriber');

                      J'attends votre help, merci.

Bonsoir, Je ne vois comment un tel sujet a pu être résolu.
Tout d'abord, je pense que pour récupérer le Manager dans le contrôleur, il faut utiliser la méthode getManager() au lieu de getEntityManager() qui est obsolète dans les dernières version de symfony. Maintenant concernant ta jointure, il serait souhaitable de nous présenter le code des entités qui interviennent dans la jointure. En effet cette jointure doit être faite dans ton repository et non sur un tableau d'objet de ta requête.

Bonjour, je suis à deux doit d'optimiser mon code, il me faut convertir ma reqûete en symfony2
SELECT mi_subscriber.*, mi_agency.title FROM mi_subscriber, mi_fos_user, mi_depeche_filtering, mi_category, mi_agency WHERE mi_subscriber.id = mi_fos_user.subscriber_id and mi_fos_user.id = mi_depeche_filtering.user_id and mi_depeche_filtering.category_id = mi_category.id and mi_category.agency_id = mi_agency.id

Comment puis-je faire, j'ai essayer sql native mais sans succè. http://sf2.memosdedev.com/creer-une-requete-sql-native-dans-symfony2-avec-doctrine2.html

Imaginons que tu veux récupérer tous les utilisateurs d'une base de données qui ont postés au moins 1 article et tous les articles que chaque utilisateur a posté. Ton code devrait ressembler à ceci:

// Retourne tous les utilisateurs ayant posté un ou plusieurs articles
public function myFindAllDQL() {
    return $this->_em->createQuery('
        SELECT s, a
        FROM SecureUserBundle:Subscriber s
        JOIN s.articles a
    ')->getResult();
}

Tu peux remplacer JOIN par LEFT JOIN si tu veux tous les utilisateurs qui n'ont pas nécessairement postés un article.

Maintenant il ne reste plus qu'à adapter cet exemple à ton besoin.