2017-07-19 1 views
0

Je rencontre des problèmes pour obtenir mes résultats avec le générateur de requête de doctrine, dans une application Symfony 2.8:Doctrine query builder ne donne pas tous les résultats: many-to-many recherche id (x, y)

J'ai ici 3 entités:

  • Chanson
  • Artiste
  • Catégorie

Tout fils gs au moins 1 artiste et 1 catégorie

Chanson a ManyToMany relation avec Artiste et ManyToMany avec Catégorie aswell

Je voudrais obtenir les entités de chansons ayant la mêmes artistes OU catégories qu'une chanson donnée à cette fonction:

public function findRelatedSongs($song) 
{ 
    $em = $this->getEntityManager(); 

    $artistsIds = $this->getArtistsIds($song); 
    //returns a string like '1,2,3' 
    $categoriesIds = $this->getCategoriesIds($song); 
    //returns a string like '1,2,3' 

    $q = $em->getRepository("BeatAdvisorBundle\Entity\Song") 
      ->createQueryBuilder('s') 
      ->join('s.artists', 'a') 
      ->join('s.categories', 'c') 
      ->where('a.id in (:artistsIds)') 
      ->orWhere('c.id in (:categoriesIds)') 
      ->andWhere('s.id <> :songId') 
      ->setParameter('artistsIds', $artistsIds) 
      ->setParameter('categoriesIds', $categoriesIds) 
      ->setParameter('songId', $song->getId()) 
      ->getQuery(); 

    $sql = $q->getSql(); 
    // here I can read the sql query generated 

    $result = $q->setMaxResults(16) 
       ->getResult(); 

    return $result; 
} 

Il me rend les chansons liées sur les mêmes artistes, mais pas sur les catégories.

Y at-il un problème avec la façon dont j'ai écrit ceci?

Si je copier et coller la requête SQL, le réglage des paramètres Ids comme something_id in (1,2) cela fonctionne bien ...

EDIT

Maintenant, je sais que cette chanson-A ayant seul artiste-x correspondre à certaines chansons ayant seulement artist-x; même pour les catégories. peut être un problème de type (string VS int) causant des problèmes avec in(x,y) au lieu de in (x)? ...

Répondre

0

Pour autant que je sache, Doctrine utilise DQL (Doctrine Query Language), pas SQL. Les expressions sont un peu différentes parfois. Vous pouvez utiliser l'objet Expression QueryBuilders pour créer par programme vos expressions.

$qb->where(
    $qb->expr()->in('a.id', ':artistsIds'), 
    $qb->expr()->eq('s.id', ':songId') 
); 

Référence: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html

+0

va essayer ce .. ty –

+0

Même résultat ... il pourrait y avoir quelque chose ailleurs ... –

0

OK, mon erreur était de définir mes paramètres comme chaîne (tableaux de implosé ids).

je devais donner le tableau de nombres entiers se ...