Bonjour,
J'essaye d'envoyé un csv vers une bdd et certains champs me pose problèmes car ce sont des champs avec clé étrangère !
j'ai évidement regardé la doc et cherché sur le net mais j'ai toujours des message d'erreurs.
Ce que je cherche à faire : Insérer les données du CSV directement dans la table [Signalement]. Dans ce CSV, j'ai une colonne "Nom de la structure", ce nom doit faire référence à un [nom] qui est dans la table [Structure] mais pas dans ma table [Signalement], et avec son [nom] j'aimerais identifier son [id] et ainsi récupérer d'autres information par son intermédiaire
Pour bien faire, avant de passer par un système de form pour importer un csv, j'ai commencé ce travail par une commande :
Avec ce code j'avais une première erreur de ce genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 <?php namespace App\Command; use App\Entity\Structure; use DateTimeImmutable; use League\Csv\Reader; use App\Entity\Signalement; use League\Csv\Statement; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class ImportCSVCommand extends Command { private $em; public function __construct(EntityManagerInterface $em) { parent::__construct(); $this->em = $em; } protected function configure(): void { $this ->setName('csv:import') ->setDescription("Import CSV in DB") ; } protected function execute(InputInterface $input,OutputInterface $output): int { $io = new SymfonyStyle($input, $output); $io->title('Import CSV ...'); $csv = Reader::from('src/Data/listedeproduit.csv', 'r'); $csv->setHeaderOffset(0); $csv->setDelimiter(';'); $csv->setEscape(''); $records = $csv->getRecords(); foreach ($records as $record){ $structure = (new Structure()) ->setNom($record['Nom de la structure']); $signalement = (new Signalement()) ->setNumero($record['Identifiant de la fiche']) ->setStructure($structure) ; //etc... $this->em->persist($signalement); } $this->em->flush(); $io->success('Great CSV in DB !'); return Command::SUCCESS; } }
De ce que j'ai compris c'est parce que l'entity Structure n'était pas persister... ! J'ai donc ajouter
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 A new entity was found through the relationship 'App\Entity\Signalement#structure' that was not configured to cascade persist operations for entity: 9. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).
$this->em->persist($structure); en dessous de l'autre persist...
Mais a partir de là il me met un autres message d'erreur
il concerne un autre champs de Structure mais pas de Signalement dont je ne me sert pas ici...
Code : Sélectionner tout - Visualiser dans une fenêtre à part SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'finess_g' ne peut être vide (null)
Je pense que j'ai pas compris quelques chose ou que je fait mal un truc ! Mais déjà dans un premier temps j'ai l'impression que le (new STructure) n'est pas bon dans le sens ou je n'essaie pas de rentrer une nouvelle structure mais un nouveau signalement et dans ce signalement j'ai une colonne structure_id !
Voilà ! je sais pas si j'ai été très clair !! Merci






Répondre avec citation




Partager