Laravel 6

Erreur de seeder

Avatar de InesOUATTARA
InesOUATTARA

Hello à tous! Je travail sur un projet et lors de la population j'ai une erreur. Je vous donne le code ci-dessous :

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        User::withoutEvents(function () {
            // Create 1 admin
            User::factory()->create([
                'role' => 'admin',
            ]);
            // Create 2 redactors
            User::factory()->count(2)->create([
                'role' => 'redac',
            ]);
            // Create 3 users
            User::factory()->count(3)->create();
        });
        $nbrUsers = 6;
        
        DB::table('categories')->insert([
            [
                'title' => 'Category 1',
                'slug' => 'category-1'
            ],
            [
                'title' => 'Category 2',
                'slug' => 'category-2'
            ],
            [
                'title' => 'Category 3',
                'slug' => 'category-3'
            ],
        ]);
        $nbrCategories = 3;

        DB::table('tags')->insert([
            ['tag' => 'Tag1', 'slug' => 'tag1'],
            ['tag' => 'Tag2', 'slug' => 'tag2'],
            ['tag' => 'Tag3', 'slug' => 'tag3'],
            ['tag' => 'Tag4', 'slug' => 'tag4'],
            ['tag' => 'Tag5', 'slug' => 'tag5'],
            ['tag' => 'Tag6', 'slug' => 'tag6']
        ]);
        $nbrTags = 6;

        Post::withoutEvents(function () {
            foreach (range(1, 2) as $i) {
                Post::factory()->create([
                    'title' => 'Post ' . $i,
                    'slug' => 'post-' . $i,
                    'seo_title' => 'Post ' . $i,
                    'user_id' => 2,
                    'image' => 'img0' . $i . '.jpg',
                ]);
            }
            foreach (range(3, 9) as $i) {
                Post::factory()->create([
                    'title' => 'Post ' . $i,
                    'slug' => 'post-' . $i,
                    'seo_title' => 'Post ' . $i,
                    'user_id' => 3,
                    'image' => 'img0' . $i . '.jpg',
                ]);
            }
        });
        $nbrPosts = 9;

        // Tags attachment
        $posts = Post::all();
        foreach ($posts as $post) {
            if ($post->id === 9) {
                $numbers=[1,2,5,6];
                $n = 4;
            } else {
                $numbers = range (1, $nbrTags);
                shuffle ($numbers);
                $n = rand (2, 4);
            }
            for($i = 0; $i < $n; ++$i) {
                $post->tags()->attach($numbers[$i]);
            }
        }
        // Set categories
        foreach ($posts as $post) {
            if ($post->id === 9) {
                DB::table ('category_post')->insert ([
                    'category_id' => 1,
                    'post_id' => 9,
                ]);
            } else {
                $numbers = range (1, $nbrCategories);
                shuffle ($numbers);
                $n = rand (1, 2);
                for ($i = 0; $i < $n; ++$i) {
                    DB::table ('category_post')->insert ([
                        'category_id' => $numbers[$i],
                        'post_id' => $post->id,
                    ]);
                }
            }
        }

        foreach (range(1, $nbrPosts - 1) as $i) {
            Comment::factory()->create([
                'post_id' => $i,
                'user_id' => rand(1, $nbrUsers),
            ]);
        }

        $faker = \Faker\Factory::create();
        Comment::create([
            'post_id' => 2,
            'user_id' => 3,
            'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
            'children' => [
                [
                    'post_id' => 2,
                    'user_id' => 4,
                    'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                    'children' => [
                        [
                            'post_id' => 2,
                            'user_id' => 2,
                            'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                        ],
                    ],
                ],
            ],
        ]);
        Comment::create([
            'post_id' => 2,
            'user_id' => 6,
            'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
            'children' => [
                [
                    'post_id' => 2,
                    'user_id' => 3,
                    'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                ],
                [
                    'post_id' => 2,
                    'user_id' => 6,
                    'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                    'children' => [
                        [
                            'post_id' => 2,
                            'user_id' => 3,
                            'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                        
                            'children' => [
                                [
                                    'post_id' => 2,
                                    'user_id' => 6,
                                    'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ]);
        Comment::create([
            'post_id' => 4,
            'user_id' => 4,
            'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
            'children' => [
                [
                    'post_id' => 4,
                    'user_id' => 5,
                    'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                    'children' => [
                        [   'post_id' => 4,
                            'user_id' => 2,
                            'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                        ],
                        [
                            'post_id' => 4,
                            'user_id' => 1,
                            'body' => $faker->paragraph($nbSentences = 4, $variableNbSentences = true),
                        ],
                    ],
                ],
            ],
        ]);


       // Pages
        $items = [
            ['about-us', 'About us'],
            ['terms', 'Terms'],
            ['faq', 'FAQ'],
            ['privacy-policy', 'Privacy Policy'],
        ];
        foreach($items as $item) {
            Page::factory()->create([
                'slug' => $item[0],
                'title' => $item[1],
            ]);
        }

    }
}

Besoin d'eclaicissement sur cette erreur https://ibb.co/qgjxkDH

Comment puis-je y remédié.

Posté il y a 2 ans
Avatar de VassiliJoffroy
VassiliJoffroy

Bonjour,

pour commencé tu peux séparé les seeder en plusieurs fichier : UserSeeder, PageSeeder CommentSeeder etc etc cest plus clair !

Ensuite il existe des Factory... pour en autre, faker, ensuite il existe des Event pour les choses simples comme les Slug etc, ensuite Eloquent sur chaque model est puissant plutot que des DB etc enfin bref !

et de deux, je ne parle pas cette langue l'erreur est assez ilisible mais visiblement tu as une col qui n'éxiste pas, reviens vers nous après ca !

Posté il y a 2 ans
Avatar de Rezrazi
Rezrazi

Alors, il faudrait plutôt homogéniser ton code, c'est meilleur d'utiliser des Factory pour les seeders de tes models.

  • Crée des factory pour tes models avec php artisan make:factory PostFactory au lieu d'utiliser DB::, tu pourras aussi utiliser Faker facilement avec $this->faker https://laravel.com/docs/8.x/database-testing#generating-factories
  • Crée des seeders pour tes models avec php artisan make:seeder PostSeeder, dans ces seeders tu pourra séparer tes différents seed spécifiques et les inclure dans DatabaseSeeder avec $this->call(PostSeeder::class); https://laravel.com/docs/8.x/database-testing#running-seeders
  • Pour désactiver les events, tu peux rajouter User::flushEventListeners() avant de déclencher tes factories
  • Pour tes factory pour le model Post, tu peux potentiellement utiliser des states pour éviter les blocs de code plus ou moins dupliqués, un truc du genre
public function withIdAndUserId(int $id, int $user_id)
{
    return $this->state(function (array $attributes) {
        return [
           'title' => 'Post ' . $id,
           'slug' => 'post-' . $id,
           'seo_title' => 'Post ' . $id,
           'user_id' => $user_id,
           'image' => 'img0' . $id . '.jpg',
        ];
    });
}

// utiliser avec 
Post::factory()->withIdAndUserId($i,2)->create();

https://laravel.com/docs/8.x/database-testing#factory-states

  • Ta boucle foreach ($posts as $post) { est dupliquée, autant utiliser la même boucle
  • Au lieu de créer tes Post et puis les récupérer avec Post::all(), c'est plus judicieux d'appliquer ta méthode ->tags() au moment de la création du Post, ca fera moins de requêtes SQL, cherche plutôt un moyen de faire ça dans la factory PostFactory
  • Si t'as des models qui sont en relationship avec d'autres, il est possible de seeder ça avec des nouvelles méthodes https://laravel.com/docs/8.x/database-testing#factory-relationships

Pour ton erreur, il faut tout copier plutôt dans un bloc code en commentaire plutôt qu'une capture écran, et il semblerai qu'une colonne manque dans ta DB, vérifie tes migrations, et en particulier la colonne meta_description

php artisan migrate:fresh --seed

Regards, C

Posté il y a 2 ans
Avatar de InesOUATTARA
InesOUATTARA

Merci @Rezrazi pour la reponse.

En realité, j'ai déjà des Factory que j'avais prevu mais dans ce cas de figure je recherchais plus une lecture du code d'erreur.

Merci !

Erreur de manip c'est plutôt @Rezrazi qui à repondu au mieux à ma préocuppation.

Posté il y a 2 ans

Vous ne pouvez pas répondre à ce sujet.