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
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 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 ...
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****
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