165 votes

Remplissage d'une base de données dans un fichier de migration Laravel

Je viens d'apprendre Laravel, et j'ai un fichier de migration fonctionnel qui crée une table d'utilisateurs. J'essaie de remplir un enregistrement d'utilisateur dans le cadre de la migration :

public function up()
{
    Schema::create('users', function($table){

        $table->increments('id');
        $table->string('email', 255);
        $table->string('password', 64);
        $table->boolean('verified');
        $table->string('token', 255);
        $table->timestamps();

        DB::table('users')->insert(
            array(
                'email' => 'name@domain.com',
                'verified' => true
            )
        );

    });
}

Mais j'obtiens l'erreur suivante lors de l'exécution php artisan migrate :

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist

C'est évidemment parce qu'Artisan n'a pas encore créé la table, mais toute la documentation semble dire qu'il existe un moyen d'utiliser Fluent Query pour alimenter les données dans le cadre d'une migration.

Quelqu'un sait comment ? Merci.

1voto

Une autre façon propre de le faire est de définir une méthode privée qui crée une instance et persiste le modèle concerné.

public function up()
{
    Schema::create('roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('label', 256);
        $table->timestamps();
        $table->softDeletes();
    });

    $this->postCreate('admin', 'user');
}

private function postCreate(string ...$roles)  {
    foreach ($roles as $role) {
        $model = new Role();
        $model->setAttribute('label', $role);
        $model->save();
    }
}

Avec cette solution, les champs d'horodatage seront générés par Eloquent.

EDIT : il est préférable d'utiliser un système de seeder pour distinguer la génération de la structure de la base de données et la population de la base de données.

1voto

Andrew Arscott Points 156

J'ai essayé cette méthode d'insertion de DB, mais comme elle n'utilise pas le modèle, elle a ignoré un trait de ralentissement que j'avais sur le modèle. Donc, étant donné que le modèle de cette table existe, dès qu'il sera migré, je me suis dit que le modèle serait disponible pour insérer des données. Et j'ai trouvé ceci :

public function up() {
        Schema::create('parent_categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('slug');
            $table->timestamps();
        });
        ParentCategory::create(
            [
                'id' => 1,
                'name' => 'Occasions',
            ],
        );
    }

Cela a fonctionné correctement, et a également pris en compte le trait sluggable sur mon modèle pour générer automatiquement un slug pour cette entrée, et utilise également les timestamps. NB. L'ajout de l'ID n'était pas nécessaire, cependant, je voulais des ID spécifiques pour mes catégories dans cet exemple. Testé en fonctionnement sur Laravel 5.8

0voto

aladin Points 11

Si vous avez déjà rempli des colonnes et que vous en avez ajouté une nouvelle, ou si vous voulez remplir une ancienne colonne avec de nouvelles valeurs fictives, procédez comme suit :

public function up()
{
    DB::table('foydabars')->update(
        array(
            'status' => '0'
        )
    );
}

0voto

Paweł Moskal Points 79

En modifiant la première option de La réponse de Martin Mbae Si vous voulez obtenir le même résultat que la deuxième option, mais sans utiliser le modèle, vous pouvez simplement faire ceci :

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });

    $sampleData = ['sample1', 'sample2', 'sample3'];
    $data = [];

    foreach ($sampleData as $sample) {
        $data[] = [
            'table_name' => $sample,
            'created_at' => now(),
            'updated_at' => now()
        ];
    }

    DB::table('categories')->insert($data);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X