Много записей через цикл for в сидере Laravel
Иногда таблицу нужно наполнить не одной записью, а десятками - посты для проверки списка, пользователи для фильтра. Строки похожи по структуре, но значения в каждой свои: свой заголовок, свой slug, своя случайная строка.
Прописывать такие данные
по одной или собирать длинный
массив для массовой вставки
неудобно. Проще описать правило
один раз и выполнить его
нужное число раз. Для этого
в PHP используют цикл for.
Цикл for повторяет блок
кода заданное количество раз.
Сначала разберём его устройство -
без базы, чтобы было видно,
как считаются повторения:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
for ($i = 0; $i < 5; $i++) {
// тело цикла
}
}
}
?>
Переменная $i начинается
с 0 и растёт, пока
меньше 5. Значит, тело
выполнится ровно пять раз -
при $i равных
0, 1, 2,
3, 4.
Число итераций меняют
в условии: для десяти
повторений пишут $i < 10.
Теперь поместим в тело цикла
insert. На каждом проходе
Laravel выполнит отдельную
вставку в таблицу, а
Str::random вернёт
новое значение:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
for ($i = 0; $i < 3; $i++) {
DB::table('posts')->insert([
'title' => Str::random(10),
'slug' => Str::random(10),
'text' => Str::random(50),
]);
}
}
}
?>
После db:seed в таблице
posts появятся три строки.
У каждой свой набор случайных
полей - так не получилось бы
с одной массовой вставкой
и одним Str::random
на все записи.
Переменную $i можно
использовать в данных -
например, добавить номер
к slug. Пока достаточно
простого повторения insert.
Выполним команду на вставку:
php artisan db:seed
Сделайте сидер, который добавит в базу несколько постов со случайными полями через цикл.
Сколько раз выполнится тело
цикла при $i < 10?
Зачем цикл удобнее массовой вставки, если каждая строка должна быть случайной?
Проверьте в PMA: сколько строк добавилось?