Bonjour à tous :),

Je suis en train de faire un blog avec Symfony 5. J'aimerais le construire de la façon suivant :

Les articles auront des tags. Les catégories auront des tags.

Ce que je veux

J'aimerais que les articles soient envoyés dans les catégories selon les tag qui correspondent avec les tags des catégories.

En gros lors de la création de d'une catégorie, on lui attribut des tags à la main, et lors de la création d'un articles on lui donne les tags qui correspondent a ceux de la catégories pour qu'il 'matchent'.

Pour se faire j'ai fait une entité Tag, et les entité Articles et Catégories ont une relation ManyToMany sur Tag.

Ce que j'obtiens

Une erreur symfony 'Call to a member function getQuery() on array'


namespace App\Repository;

use App\Entity\Articles;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;

/**
 * @method Articles|null find($id, $lockMode = null, $lockVersion = null)
 * @method Articles|null findOneBy(array $criteria, array $orderBy = null)
 * @method Articles[]    findAll()
 * @method Articles[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class ArticlesRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Articles::class);
    }

    /**
     * @return Articles[] TODO
     */
    public function findMyArticles($value)
    {
        //dd($value);
        $query = $this
            ->createQueryBuilder('a')
            ->leftJoin("a.tag", "t")
            ->andWhere('t.id = :value')
            ->setParameter('value', $value)

            ->getQuery()
            ->execute();

        return $query->getQuery();
    }
}

J'appel la fonction dans mon controller comme ceci :

$result = $this->getDoctrine()
    ->getRepository(Articles::class)
    ->findMyArticles($tags1);

Je peux joindre mes entité si besoin.
Si quelqu'un a une idée de mon/mes erreurs ? Ou peut etre ma logique n'est pas la bonne?

Merci à tous :)

4 réponses


gillesr
Réponse acceptée

Bonjour,

dans ton repository ta méthode findMyArticles ne marche pas car tu fais le getQuery puis tu renvoies un $query->getResult();

il suffit de faire ça :

public function findMyArticles($value)
 {
      return $this
          ->createQueryBuilder('a')
          ->leftJoin("a.tag", "t")
          ->andWhere('t.id = :value')
          ->setParameter('value', $value)
          ->getQuery()
          ->getREsult();
 }

Et dans ton controleur :
tu peux injecter directement ton ArticlesRepository et appeler la méthode findMyArticles

gillesr
Réponse acceptée

Tu peux essayer de remplacer :

->andWhere('t.id = :value')

par :

->andWhere('t.id in (:value)')
Lou Yi
Auteur

Ouhaa merci gillessr ca fonctionne ! <3

Ca fonctionne si je mets une seule valeur (que se soit dans un array ou pas).

$tags1 = [1];
        $result = $this->getDoctrine()
            ->getRepository(Articles::class)
            ->findMyArticles($tags1);

Mais je je veux utiliser plusieurs valeurs dans $tag1 par exemple

$tags1 = [1, 2];
        $result = $this->getDoctrine()
            ->getRepository(Articles::class)
            ->findMyArticles($tags1);

An exception occurred while executing 'SELECT a0_.id AS id0, a0.title AS title1, a0.slug AS slug2, a0.content AS content3, a0.created_at AS created_at4, a0.updated_at AS updated_at5, a0.active AS active6, a0.description AS description7, a0.image_description AS image_description8, a0.featured_position AS featured_position9, a0.featured AS featured10, a0.image AS image11, a0.views AS views12, a0.author_id AS author_id13, a0.categories_id AS categories_id14 FROM articles a0 LEFT JOIN articlestag a2 ON a0.id = a2.articlesid LEFT JOIN tag t1 ON t1.id = a2.tagid WHERE t1.id = ?, ?' with params [1, 2]:

SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ' 2' à la ligne 1

erreur.. Il faudrait que je fasse une boucle dans la fonction de mon repo?

Lou Yi
Auteur

Du coup ca me recupere bien tous les articles qui ont un tag OU un autre.
Saurais tu comment ecrire pour avoir les articles qui ont le tag1 ET le tag 2 ? ^^

J'ai essayé de rajouter ->distinct() apres le ->setParameter('value', $value), mais ca ne chage rien au resultat.

Encore mille merci