Recherche…


Diriger un semoir

Vous pouvez ajouter votre nouveau Seeder à la classe DatabaseSeeder.

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserTableSeeder::class);
    }

Pour exécuter un segment de base de données, utilisez la commande Artisan

php artisan db:seed

Cela exécutera la classe DatabaseSeeder. Vous pouvez également choisir d'utiliser l'option --class= pour spécifier manuellement le --class= à exécuter.

* Remarque: vous devrez peut-être exécuter le composeur dumpautoload si votre classe Seeder est introuvable. Cela se produit généralement si vous créez manuellement une classe de segment au lieu d'utiliser la commande artisan.

Créer une semence

Les semences de base de données sont stockées dans le répertoire / database / seeds. Vous pouvez créer une graine en utilisant une commande Artisan.

php artisan make:seed UserTableSeeder

Sinon, vous pouvez créer une nouvelle classe qui étend Illuminate\Database\Seeder . La classe doit avoir une fonction publique nommée run() .

Insérer des données à l'aide d'un semoir

Vous pouvez référencer des modèles dans un semoir.

use DB;
use App\Models\User;

class UserTableSeeder extends Illuminate\Database\Seeder{

    public function run(){
        # Remove all existing entrie
        DB::table('users')->delete() ;
        User::create([
            'name' => 'Admin',
            'email' => '[email protected]',
            'password' => Hash::make('password')
        ]);

    }
}

Insertion de données avec une fabrique de modèles

Vous voudrez peut-être utiliser les usines modèles dans vos semences. Cela va créer 3 nouveaux utilisateurs.

use App\Models\User;

class UserTableSeeder extends Illuminate\Database\Seeder{

    public function run(){
        factory(User::class)->times(3)->create();    
    }
}

Vous souhaiterez peut-être également définir des champs spécifiques sur votre semis, comme un mot de passe, par exemple. Cela créera 3 utilisateurs avec le même mot de passe.

factory(User::class)->times(3)->create(['password' => '123456']);    

Amorcer avec MySQL Dump

Suivez l'exemple précédent de création d'une graine. Cet exemple utilise un vidage MySQL pour générer une table dans la base de données du projet. La table doit être créée avant le semis.

<?php

use Illuminate\Database\Seeder;

class UserTableSeeder extends Seeder
{

    /**
     * Run the database seeds.
     *
     * @return void
     */
     public function run()
     {
         $sql = file_get_contents(database_path() . '/seeds/users.sql');
    
         DB::statement($sql);
      }
}

Notre $ sql va être le contenu de notre vidage users.sql. Le vidage doit avoir une instruction INSERT INTO. Ce sera à vous de décider où vous stockerez vos décharges. Dans l'exemple ci-dessus, il est stocké dans le répertoire du projet \database\seeds . Utilisation de la fonction d'aide de laravel database_path() et ajout du répertoire et du nom de fichier du dump.

INSERT INTO `users` (`id`, `name`, `email`, `password`, `remember_token`, `created_at`, `updated_at`) VALUES
(1, 'Jane', '[email protected]', 'superSecret', NULL, '2016-07-21 00:00:00', '2016-07-21 00:00:00'),
(2, 'John', '[email protected]', 'sup3rS3cr3t', NULL, '2016-07-21 00:00:00', '2016-07-21 00:00:00');

DB::statement($sql) exécutera les insertions une fois le segment exécuté. Comme dans les exemples précédents, vous pouvez placer le UserTableSeeder dans la classe DatabaseSeeder fournie par laravel:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserTableSeeder::class);
    }
}

et exécuter à partir de la CLI dans le répertoire de projet php artisan db:seed . Ou vous pouvez exécuter le Seeder pour une seule classe en utilisant php artisan db:seed --class=UsersTableSeeder

Utiliser faker et ModelFactories pour générer des semences

1) BASIC SIMPLE WAY

Les applications basées sur des bases de données ont souvent besoin de données pré-insérées dans le système à des fins de test et de démonstration.

Pour créer de telles données, créez d'abord la classe de segmentation

ProductTableSeeder

use Faker\Factory as Faker;
use App\Product;

class ProductTableSeeder extends DatabaseSeeder {

public function run()
{
    $faker = $this->getFaker();

    for ($i = 0; $i < 10; $i++)
    {
        $name =         $faker->word;
        $image =        $faker->imageUrl;
       
        Modelname::create([
            'name' => $name,
            'image' => $image,
        ]);
      }
    }
 }

Pour appeler une classe capable d'exécuter une classe de segmentation, vous devez l'appeler depuis la classe DatabaseSeeder, simplement en passant le nom du segment que vous souhaitez exécuter:

utiliser Illuminate \ Database \ Seeder;

class DatabaseSeeder extends Seeder {

    protected $faker;

    public function getFaker() {
        if (empty($this->faker)) {
            $faker = Faker\Factory::create();
            $faker->addProvider(new Faker\Provider\Base($faker));
            $faker->addProvider(new Faker\Provider\Lorem($faker));
        }
        return $this->faker = $faker;
    }
    public function run() {
        $this->call(ProductTableSeeder::class);
    }
}

N'oubliez pas de lancer $ composer dump-autoload après avoir créé le Seeder, car ils ne sont pas automatiquement chargés automatiquement par le composeur (sauf si vous avez créé la commande $ php artisan make:seeder Name )

Vous êtes maintenant prêt à lancer en exécutant cette commande php artisan db:seed

2) UTILISATION des usines modèles

Tout d'abord, vous devez définir un ensemble d'attributs par défaut pour chaque modèle dans App/database/factories/ModelFactory.php

Prenant un modèle d'utilisateur comme exemple, voici à quoi ressemble un ModelFactory

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => bcrypt(str_random(10)),
        'remember_token' => str_random(10),
    ];
});

Maintenant, créez une table de création php artisan make:seeder UsersTableSeeder

Et ajoutez ceci

public function run()
{
    factory(App\User::class, 100)->create()
}

puis ajoutez ceci à la DatabaseSeeder

public function run()
{
    $this->call(UsersTableSeeder::class);
}

Cela va semer la table avec 100 enregistrements.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow