Erreur de seeder
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é.
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 !
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'utiliserDB::
, 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
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.
Vous ne pouvez pas répondre à ce sujet.