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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 987
    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 987
    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?

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