IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Insérer les valeurs d'un tableau pour des besoins d'une Fixture


Sujet :

Symfony PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut Insérer les valeurs d'un tableau pour des besoins d'une Fixture
    Bonjour a tous,

    Je suis en train de me faire une fixtures pour avoir quelques catégories en adéquation avec mes besoins.

    Voici mon code :
    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
            // Mise en place des catégories, dans l'exemple la catégorie Musique est le seul parent.
            $categories = [
                ['title' => 'Musique',  'parent' => 0],
                ['title' => 'Piano',    'parent' => 1],
                ['title' => 'Guitare',  'parent' => 1],
                ['title' => 'Chant',    'parent' => 1],
                ['title' => 'Batterie', 'parent' => 1],
                ['title' => 'Violon',   'parent' => 1],
                ['title' => 'Danse',    'parent' => 1]
            ];
     
            // Je ne sais pas comment récupérer les valeurs afin de les insérer pour les besoins de la Fixture.
            for ($i = 0; $i < count($categories); ++$i) {
                $category = new Category();
     
                $parent = $categories["parent"][$i];
                $title  = $categories["title"][$i];
                $slug   = $slugifier->slugify($title);
     
                $category
                    ->setParent($parent)
                    ->setTitle($title)
                    ->setSlug($slug);
     
                $manager->persist($category);
                $categories[$i] = $category;
            }
    Mon éditeur me dit :
    Expected type 'null|App\Entity\Category'. Found 'string|int'.intelephense(1006)
    ok mais.. je ne sais pas quoi faire

    avez vous des idées ? Je vous remercie.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Bonjour,

    Votre boucle '$i' va passer de l'état de 0 à 6
    parent va de 0 à 1 , le zéro ok, mais le 1 il y est 6 fois, lesquel prendre ?

    Ensuite vous noter ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $title  = $categories["title"][$i];
    hors dans las valeurs de 'title', il n'y a aucun indice 0-6 , mais bien des string (violon,Piano....), donc rien ne peux s'afficher.

    Je pense (je peux me tromper), que c'est ceci que vous voulez faire

    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
     
        foreach ($categories as &$values) {
                $category = new Category();
     
                $parent = $values["parent"];
                $title  = $values["title"];
                //je en vois pas le code le $slugifier ?
                $slug   = $slugifier->slugify($title);
     
                $category
                    ->setParent($parent)
                    ->setTitle($title)
                    ->setSlug($slug);
     
                $manager->persist($category);
                // Si vous voulez vraiment changer votre tableau $categories
                // et remplacer la ligne en cours par votre persistence
                // donc à la sortie votre tableau sera transformé
                $values = $category;
            }

  3. #3
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    Salut et merci pour la réponse, je n'ai pas réussi a adapter ton code

    Pour être plus précis dans mon but : j'ai déjà une fixture qui fonctionne très bien dont voici le code entier :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    <?php
     
    namespace App\DataFixtures;
     
    use Faker\Factory;
    use App\Entity\User;
    use App\Entity\Course;
    use App\Entity\Category;
    use Cocur\Slugify\Slugify;
    use Doctrine\Persistence\ObjectManager;
    use Doctrine\Bundle\FixturesBundle\Fixture;
    use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
     
    class AppFixtures extends Fixture
    {
        private $encoder;
     
        public function __construct(UserPasswordEncoderInterface $encoder)
        {
            $this->encoder = $encoder;
        }
     
        public function load(ObjectManager $manager)
        {
            // Mise en place
            $faker      = Factory::create('fr_FR');
            $slugifier  = new Slugify();
     
            // Mise en place des catégories
            $categories = [
                "Musique",
                "Piano",
                "Guitare",
                "Chant",
                "Batterie",
                "Violon",
                "Danse"
            ];
     
            for ($i = 0; $i < count($categories); ++$i) {
                $category = new Category();
     
                $title  = $categories[$i];
                $slug   = $slugifier->slugify($title);
     
                $category
                    ->setTitle($title)
                    ->setSlug($slug);
     
                $manager->persist($category);
                $categories[$i] = $category;
            }
     
            // Mise en place des utilisateurs
            $users = [];
     
            for ($i = 1; $i < mt_rand(30, 40); $i++) {
                $user = new User();
     
                $firstName  = $faker->firstName();
                $lastName   = $faker->lastName();
                $email      = $faker->email;
                $password   = $this->encoder->encodePassword($user, 'aaaaaa');
                $createdAt  = $faker->dateTimeBetween('-2 years', 'now');
     
                $user
                    ->setFirstName($firstName)
                    ->setLastName($lastName)
                    ->setEmail($email)
                    ->setPassword($password)
                    ->setCreatedAt($createdAt);
     
                $manager->persist($user);
                $users[] = $user;
            }
     
            // Mise en place des annonces
            for ($i = 1; $i <= mt_rand(50, 60); $i++) {
                $ad = new Course();
     
                $title          = $faker->words(mt_rand(4, 6), true);
                $slug           = $slugifier->slugify($title);
                $content        = $faker->paragraphs(mt_rand(3, 6), true);
                $price          = mt_rand(15, 80);
                $author         = $users[mt_rand(0, count($users) - 1)];
                $publishedAt    = $faker->dateTimeBetween('-2 years', 'now');
                $lat            = $faker->latitude();
                $lng            = $faker->longitude();
                $postalCode     = $faker->postcode();
                $city           = $faker->city();
                $address        = $faker->address();
                $category       = $categories[mt_rand(0, count($categories) - 1)];
     
                $ad
                    ->setTitle($title)
                    ->setSlug($slug)
                    ->setContent($content)
                    ->setPrice($price)
                    ->setAuthor($author)
                    ->setPublishedAt($publishedAt)
                    ->setLat($lat)
                    ->setLng($lng)
                    ->setPostalCode($postalCode)
                    ->setCity($city)
                    ->setAddress($address)
                    ->setCategory($category);
     
                $manager->persist($ad);
            }
     
            $manager->flush();
        }
    }
    Mon but : Mon entité Category a évolué et j'ai maintenant un champ parent, je voulais donc rajouter la valeur parent au tableau $categories afin que la fixture insère les données title + parent.

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Ok, alors ceci devrais passer

    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
     
     
     $categories = [
                ['Musique', 0],
                ['Piano',1],
                ['Guitare',1],
                ['Chant',1],
                ['Batterie',1],
                ['Violon',1],
                ['Danse',1]
            ];
     
            // Je ne sais pas comment récupérer les valeurs afin de les insérer pour les besoins de la Fixture.
            for ($i = 0; $i < count($categories); ++$i) {
                $category = new Category();
     
                $parent = $categories[$i][1];
                $title  = $categories[$i][0];
                $slug   = $slugifier->slugify($title);

  5. #5
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    Bon, après 3 jours j'ai toujours le même problème avec le "parent" qui ne veut pas prendre un entier, mais voici la nouvelle version de ma Fixtures beaucoup plus propre :

    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
     
    <?php
     
    namespace App\DataFixtures;
     
    use App\Entity\Category;
    use Cocur\Slugify\Slugify;
    use Doctrine\Persistence\ObjectManager;
    use Doctrine\Bundle\FixturesBundle\Fixture;
     
    class CategoryFixtures extends Fixture
    {
        public function load(ObjectManager $manager)
        {
            $slugifier = new Slugify();
     
            // Mise en place des catégories
            $categories = [
                1 => ['title' => 'Musique',     'parent' => 0],
                2 => ['title' => 'Piano',       'parent' => 1],
                3 => ['title' => 'Guitare',     'parent' => 1],
                4 => ['title' => 'Chant',       'parent' => 1],
                5 => ['title' => 'Batterie',    'parent' => 1],
                6 => ['title' => 'Violon',      'parent' => 1],
                7 => ['title' => 'Danse',       'parent' => 1]
            ];
     
            foreach ($categories as $key => $value) {
                $category = new Category();
     
                $slug = $slugifier->slugify($value['title']);
     
                $category
                    ->setTitle($value['title'])
                    ->setSlug($slug)
                    ->setParent($value['parent']); // Ici la valeur est un entier alors que mon champ parent attend un objet
     
                $manager->persist($category);
     
                $this->addReference('category_' . $key, $category);
            }
     
            $manager->flush();
        }
    }
    LE BUT : Je souhaite mettre les catégories Piano, Guitare, Chant, Batterie, Violon, Danse dans la catégorie parent 'Musique'

    LE PROBLEME : La ligne 36 pose problème car mon entité Category attend un objet dans le champ parent alors que j'envoie un entier ! Mais comment faire autrement ?

    merci

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Ne peut-on pas faire ceci: ->setParent($this->getReference('category_' . $value['parent'])); ?

    Par contre il va falloir ruser pour la catégorie racine (Musique) qui, elle n'a pas de parent pour le coup. En lui passant null?

  7. #7
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Ne peut-on pas faire ceci: ->setParent($this->getReference('category_' . $value['parent'])); ?
    Salut, je n'ai pas testé ton code mais pour moi, rien n'indique que la valeur est un objet de Category dans ton code, c'est une valeur du tableau, et donc le même problème que moi.

    Citation Envoyé par CosmoKnacki Voir le message
    Par contre il va falloir ruser pour la catégorie racine (Musique) qui, elle n'a pas de parent pour le coup. En lui passant null?
    oui, aucun problème pour null, le champ parent accepte bien un null..

  8. #8
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Citation Envoyé par bndd24 Voir le message
    rien n'indique que la valeur est un objet de Category dans ton code, c'est une valeur du tableau, et donc le même problème que moi.
    Non, c'est juste l'index du tableau qui est réutilisé pour trouver la référence que tu as déjà enregistrée dans un tour de boucle précédent, cette référence renvoie bien une instance de Category via la méthode getReference puisque tu as écris:$this->addReference('category_' . $key, $category);

Discussions similaires

  1. Réponses: 30
    Dernier message: 04/12/2017, 21h18
  2. Compter les valeurs d'un tableau entre des intervalles
    Par popoliline dans le forum Langage
    Réponses: 3
    Dernier message: 16/03/2010, 14h23
  3. Réponses: 6
    Dernier message: 12/01/2010, 15h39
  4. [MySQL] Afficher les valeurs d'un tableau pour des cases à cocher
    Par tiesto95 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/12/2008, 16h45
  5. Insérer les valeurs d'un tableau dans une table
    Par Konami15 dans le forum ASP
    Réponses: 30
    Dernier message: 30/09/2008, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo