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.