IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

Vérifier l’existence d'une jointure sur une relation ManyToMany Self-referencing


Sujet :

Doctrine2 PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut Vérifier l’existence d'une jointure sur une relation ManyToMany Self-referencing
    Bonjour à tous,

    Comme sur Twitter, mes membres pourront suivre d'autres membres.

    Je cherche à créer une méthode pour savoir si le user1 suit le user2. Pour ça j'ai tenté ce code dans un repository :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class UserRepository extends EntityRepository
    {
    	public function isFollowing($followerId, $followingId)
    	{
    		return $this->createQueryBuilder('f')
    		->select('COUNT(f)')
    		->where('f.userFollowing = :followingId', 'f.userFollower = :followerId')
    		->setParameter('followerId', $followerId)
    		->setParameter('followingId', $followingId)
    		->getQuery()
    		->getSingleScalarResult();
    	}
    }
    Mais je me retrouve avec une erreur :
    [Semantical Error] line 0, col 58 near 'userFollowing': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
    Et bien sûr, je n'arrive pas du tout à voir d'où le problème peut venir.

    Avez vous une idée ?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Si c'est une relation ManyToMany userFollowing et userFollowing sont des collections d'objets user , et tu ne peux pas comparer une collection (u.userFollower) à un entier (followerId).

    Dans la doc sur le DQL il y a des exemples avec le mot-clé CONTAINS pour savoir si une collection contient un item.
    Le site de Doctrine semble indisponible mais ça pourrait ressembler à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $dql="
    SELECT COUNT(f) FROM User u
    WHERE u.userFollowing CONTAINS :followingId
    AND u.id=:followerId"
    $em->createQuery($dql)
    ->setParameters()//etc...
    D'autre part la fonction where du query builder attend un seul argument et tu lui en passe deux
    https://github.com/doctrine/doctrine...lder.php#LC766

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Bon finalement j'ai réfléchi un peu plus en mode relationnel qu'en mode objet et j'y suis arrivé avec cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	return $this->createQueryBuilder('follower')
    	->join('follower.userFollowing', 'following')
    	->select('COUNT(follower)')
    	->where('follower.id = :followerId', 'following.id = :followingId')
    	->setParameter('followerId', $followerId)
     	->setParameter('followingId', $followingId)
    	->getQuery()
    	->getSingleScalarResult();
    Je ne sais pas si c'est optimisé mais ça marche.

    [Edit] Tu as raison pour la méthode where. Il faut que je découpe ma requête en utilisant la méthode andWhere().

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. Impact d'une jointure sur une base de données
    Par Immobilis dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/06/2009, 12h11
  3. [SQL Server] Filtré sur une table avant une jointure externe
    Par TangoZoulou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2006, 15h52
  4. Réponses: 15
    Dernier message: 14/04/2006, 15h34
  5. Réponses: 3
    Dernier message: 16/01/2006, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo