Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-06-2014 21:55:03

Pfx2
Nouveau membre
Date d'inscription: 10-06-2014
Messages: 3

Insertion dans relation N-N sans select préalables

Bonjour,

Je possède dans mon appli trois entités représentant une relation N-N. En gros les users peuvent liker un post. J'ai créé une entité centrale Like, car je veux avoir des champs supplémentaires, comme la date à la laquelle le user a liké le post.

Ca donne ça :

Post OneToMany <=> ManyToOne Like ManytoOne <=> OneToMany User

Tout va bien, en suivant la doc, je peux insérer sans problème un nouvel enregistrement dans la table like, comme ceci (le code est simplifié pour être posté ici bien sûr) :

Code:

[lang=php]// Nouvelle instance de l'entité "du milieu"
$like = new Like();
// On récupère l'id du Post et on choppe l'entité correspondante
$id = $this->getRequest()->getPost('id');
$post = $this->getPostEntity()->find($id);
// On récupère l'entité du user identifié 
$user = $this->getAuthenticationService()->getIdentity();
// On assigne le user et le post au like
$like->setPost($post);
$like->setUser($user);
// On persiste en base
$this->_em->persist($like);
$this->_em->flush();

Aucun soucis pour le code ci-dessus. Le problème, c'est que pour faire tout ça, Doctrine fait deux Select pour récupérer le Post et le User, tout ça pour au final juste faire un insert. Pas optimisé pour un sous.

Sachant que j'ai facilement l'id du Post et du User en string, y a-t-il un moyen de faire plus performant en faisant juste l'insert ? Sachant que je n'ai pas trop envie d'exécuter un statement à la main, j'aimerais profiter du fait que doctrine connait les tables et les champs...

Merci d'avance.

Dernière modification par Pfx2 (10-06-2014 21:57:11)

Hors ligne

 

#2 10-06-2014 23:26:59

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Insertion dans relation N-N sans select préalables

Salut, logiquement la requête qui récupère l'utilisateur connecté n'est faite qu'une seule fois par requête http sur l'appli. C'est mis en cache en interne dans doctrine en fonction de l'id de l'utilisateur donc là dessus pas de soucis.

Tu peux essayer de faire un setters setPostId et de mêtre l'id voir si ça fonctionne (j'en doute mais on sait jamais dans le DQL il est capable de voir si c'est un id ou une entité dans les clauses where).

Hors ligne

 

#3 11-06-2014 00:22:42

Pfx2
Nouveau membre
Date d'inscription: 10-06-2014
Messages: 3

Re: Insertion dans relation N-N sans select préalables

Hello,

Oui effectivement la requête SQL n'est faite qu'une fois par requête HTTP mais en l'occurence, quand l'utilisateur like le post je fais une requête AJAX destinée uniquement à faire cette insertion en base, donc pour le coup la requête SQL n'est pas mise en cache.

Pour les setters ça ne fonctionne pas effectivement, il comprend que ce sont des entités fake et croit qu'elles n'ont pas encore été persistées en bdd (alors que les records avec ces id existent en base évidemment):

Entity of type Like has identity through a foreign entity User, however this entity has no identity itself. You have to call EntityManager#persist() on the related entity and make sure that an identifier was generated before trying to persist 'Like'. In case of Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL) this means you have to call EntityManager#flush() between both persist operations

Hors ligne

 

#4 11-06-2014 13:10:19

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Insertion dans relation N-N sans select préalables

Ah oui ! Ca fait un petit moment que j'ai pas utilisé Doctrine mais sur les relations N-N il faut gérer le côté de la relation qui est "maitre". http://docs.doctrine-project.org/en/2.0 … pping.html regarde le point 14. En gros faut que tu fasses un truc du genre :

Code:

[lang=php]
$like->setUser($user);
$user->addLike($like);
$like->setPost($post);
$post->addLike($like);

Hors ligne

 

#5 11-06-2014 15:45:59

Pfx2
Nouveau membre
Date d'inscription: 10-06-2014
Messages: 3

Re: Insertion dans relation N-N sans select préalables

Alors ça ne marche pas tel quel, mais effectivement c'est une bonne piste, je suis en train de creuser.

Merci !

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages