Bonjour tout le monde,

Voila je rencontre un petit problème avec mon code.
Je suis sous symfony 4.3, base de donnée Maria db

Ce que je fais

Alors, pour pouvoir exécuter une commande en console, voici le code crée.
L'objectif comme son nom l'indique est de calculer le nutriscore d'une recette.

<?php

namespace App\Command;

use App\Repository\RecipeRepository;
use App\Services\Nutriscore;
use Doctrine\ORM\NonUniqueResultException;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\DependencyInjection\ContainerInterface;

class CalculNutriscoreCommand extends Command
{
    protected static $defaultName = 'calcul:nutriscore';

    /** @var ContainerInterface */
    private $container;
    /** @var Nutriscore  */
    private $nutriscore;
    /** @var RecipeRepository  */
    private $recipeRepository;

    /**
     * CalculNutriscoreCommand constructor.
     * @param ContainerInterface $container
     * @param Nutriscore $nutriscore
     * @param RecipeRepository $recipeRepository
     */
    public function __construct(ContainerInterface $container, Nutriscore $nutriscore, RecipeRepository $recipeRepository)
    {
        $this->container = $container;
        $this->nutriscore = $nutriscore;
        $this->recipeRepository = $recipeRepository;

        // you *must* call the parent constructor
        parent::__construct();
    }

    protected function configure()
    {
        $this
            ->setDescription('Calcul Nutriscore');
    }

    /**
     * @param InputInterface $input
     * @param OutputInterface $output
     * @return int
     * @throws NonUniqueResultException
     */
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        /** @var SymfonyStyle $io */
        $io = new SymfonyStyle($input, $output);

        $recipes = $this->recipeRepository->findAll();
        foreach ($recipes as $recipe) {
            $result = $this->nutriscore->getScore($recipe->getId());
        }

        $io->success('Congratulations !');

        return 0;
    }
}

Ce que je veux

ce que je voudrais c'est que la commande pour calculer le nutriscore passe.
Pour cela j'aimerais savoir pourquoi j'ai une methode getLetter(); qui est soit disant non défini ...

Ce que j'obtiens

Ainsi, lorsque je tape ma commande en console : php bin/console calcul:nutriscore

Voici le message d'erreur

[console] Error thrown while running command "calcul:nutriscore -vvv". Message: "Call to undefined method Doctrine\ORM\Query::getLetter()"
[
  "exception" => Error {
    #message: "Call to undefined method Doctrine\ORM\Query::getLetter()"
    #code: 0
    #file: "/var/www/recipe/src/Services/Nutriscore.php"
    #line: 71
    trace: {
      /var/www/recipe/src/Services/Nutriscore.php:71 {
        › if ($nutriscoreDatas) {
        ›     $recipe->setNutriscore($nutriscoreDatas->getLetter());
        ›     $recipe->setColor($nutriscoreDatas->getColor());
      }
      /var/www/recipe/src/Command/CalculNutriscoreCommand.php:60 { …}
      /var/www/recipe/vendor/symfony/console/Command/Command.php:255 { …}
      /var/www/recipe/vendor/symfony/console/Application.php:953 { …}
      /var/www/recipe/vendor/symfony/framework-bundle/Console/Application.php:87 { …}
      /var/www/recipe/vendor/symfony/console/Application.php:273 { …}
      /var/www/recipe/vendor/symfony/framework-bundle/Console/Application.php:73 { …}
      /var/www/recipe/vendor/symfony/console/Application.php:149 { …}
      /var/www/recipe/bin/console:42 { …}
    }
  },
  "command" => "calcul:nutriscore -vvv",
  "message" => "Call to undefined method Doctrine\ORM\Query::getLetter()"
]

Suite au message d'erreur je me rend dans le fichier en question, pour voir ce qui ne vas pas avec mon getLetter();

 /**
     * @param $idrecipe
     * @return Recipe|null
     * @throws NonUniqueResultException
     */
    public function getScore($idrecipe)
    {
        $recipe = $this->recipeRepository->find($idrecipe);
        $score = $this->getWeight($recipe);

var_dump($score);

        if ($score !== null) {
            $recipe->setScore($score);
            $nutriscoreDatas = $this->nutriscoreRepository->getNutriscore($score);
            if ($nutriscoreDatas) {
                $recipe->setNutriscore($nutriscoreDatas->getLetter());
                $recipe->setColor($nutriscoreDatas->getColor());
            }
            $this->em->flush();
        }
        return $recipe;
    }

Voilà ... Je ne comprend pas j'ai bien un getter et un setter dans un fichier nommé Nutriscore.php

 public function getLetter(): ?string
    {
        return $this->letter;
    }

    public function setLetter(string $letter): self
    {
        $this->letter = $letter;

        return $this;
    }

Je pense avoir fourni toutes les infos ...
Si quelqu'un a une piste

Merci beaucoup****

1 réponse


Solution trouvé !!!!

    /**
     * @param int $score
     * @return Nutriscore|null
     * @throws NonUniqueResultException
     */
    public function getNutriscore(float $score)
    {
        return $this->createQueryBuilder('n')
            ->where('n.min <= :score')
            ->andWhere('n.max >= :score')
            ->setParameter('score', round($score))
            ->getQuery()
            ->getOneOrNullResult();
    }

j'ai rajouté un setMaxResult(1) avant getOneOrNullResult();

C'est tout, ça règle le probleme