Миграция данных и заполнение данных в Laravel

задняя часть база данных PHP Laravel

Эта статья была впервые опубликована на https://jaychen.cc

Джей Чен

Это базовое руководство по сравнению с документацией Laravel.перенос данныха такжезаполнение данных.

migration

Доступно в Ларавелемиграция базы данныхСпособ управления базой данных, представьте себе сценарий: в проекте разработки с несколькими людьми ваши коллеги изменяют определенную структуру базы данных и модифицируют код, через git вы можете мгновенно синхронизировать модифицированный коллегами код, но структура базы данных, которую вы Оператор SQL, измененный коллегами, может быть скопирован и выполнен только вручную для обеспечения согласованности структуры базы данных. Затем концепция миграции базы данных в Laravel — это решение для обеспечения согласованности структуры базы данных в команде.

Миграция очень проста в использовании, напишите определенный php-код и выполните его, тогда Laravel автоматически обновит базу данных. Предположим, ваш коллега хочет модифицировать какое-то поле в базе данных, тогда вам нужно только написать php-код, затем вы обновляете код через git, и после выполнения операции миграции ваша структура базы данных будет синхронизирована с его. Давайте посмотрим, как его использовать.

migrate

Laravel относится к написанию php-кода для изменений базы данных какмигрировать, в состоянии пройтиphp artisan make:migration filenameспособ создания файлов миграции. Предположим, вам нужно создать новую пользовательскую таблицу, тогда вы можете сделатьphp artisan make:migration create_user_table --create=userчтобы создать файл миграции, выполните команду вdatabase/migrations/создать каталог文件创建时间_filenamephp, то этот файл мы будем использовать для записи изменений структуры базы данных. Здесь следует упомянуть одну вещь, хотя имя создаваемого файла миграции может быть произвольным, но для удобства управления лучше всего, чтобы имя файла могло отражать выполняемую операцию с базой данных.Например, здесь мы хотим создать пользовательская таблица, поэтому имя файлаcreate_user_table.

php artisan make:migration filenameЕсть два необязательных параметра

  • --create=tablenameУказывает, что миграция использовалась для создания таблицы.
  • --table=tablenameУказывает, что миграция используется для работы с таблицей имя_таблицы.

Созданный нами файл миграцииcreate_user_tableБудет два метода.


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


public function down()
{
    Schema::dropIfExists('user');
}

Эти два метода являются взаимными операциями, например, мы можемupметод для записи соответствующей информации пользовательской таблицы, которую мы хотим создать, иdownМетод заключается в удалении операции пользовательской таблицы. Таким образом, мы можем выполнить операцию отката.Когда мы создаем пользовательскую таблицу и обнаруживаем, что имя поля неверно, мы можем передатьdownчтобы удалить пользовательскую таблицу, а затем заново создать пользовательскую таблицу.

Предположим, что пользовательская таблица имеетid,username,emailТри поля, затем вы можете написать в методе up

public function up()
{
    Schema::create('user', function (Blueprint $table) {
        $table->increments('id')->index()->comment('用户id');
        $table->string('name')->default('')->comment('用户名');
        $table->string('email')->nullable()->comment('用户邮箱');
        $table->timestamps();
    });
}

В общем случае наша логика будет написана в функции замыкания. Приведенный выше код, даже если вы не можете полностью его понять, вы можете примерно догадаться о следующих моментах:

  • Таблица, с которой мы работаем, является таблицей пользователей.
  • Поле id определено в пользовательской таблице, поскольку вызовincrementsметод, поэтому идентификаторauto_increment, называетсяindexОписание метода добавляет индекс к идентификатору, и, наконец,commentЭквивалент комментариев.
  • Имея опыт работы с id, поле имени также хорошо понимается,stringимя описания методаvarchar/charТип,defaultОпределяет значение по умолчанию для поля имени.
  • поле электронной почты называетсяnullableМетод Описание Выполнить Поле электронной почты пусто.
  • При определении структуры поля вы можете использовать метод цепного вызова.

Метод в Laravel заключается в том, чтобы удовлетворить все ваши операции с оператором sql.Если вам нужно определить поле типа текста, вы можете вызватьtext()метод, больше описаний методов можно найти в документацииКонструктор структуры базы данных Laravel.

Мы написали структуру пользовательской таблицы, а затем выполняемphp artisan migrate, Laravel будетcreateМетод автоматически создает для нас пользовательскую таблицу. До сих пор мы успешно создавали таблицы с помощью функции переноса Larvel.

Rollback

Использование функции миграции Laravel может стать причиной сожаления.

воплощать в жизньphp artisan migrateПосле создания пользовательской таблицы вы чувствуете, что не можете этого сделать, вы не хотите использовать пользовательскую таблицу, поэтому планируете удалить эту таблицу. Итак, на этот раз мы будем использовать то, что мы только что сказалиdownметод.

public function down()
{
    Schema::dropIfExists('user');
}

Вот Лаарвел написал нам логику,dropIfExistsФункция используется для удаления таблицы, нам нужно только выполнитьphp artisan migrate :rollbackможно откатиться к исполнениюphp artisan migrateпредыдущее состояние.

переименовать таблицу

Помимо создания таблицы, вы также можете использовать любые другие операции с таблицей записей миграции, включая изменение атрибутов таблицы, изменение полей и т. д. Вот еще один пример, иллюстрирующий использование миграции для переименования таблицы.

  • Предположим, есть таблица user, нам нужно переименовать ее в users. первым выполнитьphp artisan make:migration rename_user_to_users --table userдля создания файла миграции.
  • существуетupметод, чтобы написать логику, которую мы хотим переименовать в таблице.

public function up()
{
    Schema::table('user', function (Blueprint $table) {
        Schema::rename('user','users');
    });
}
  • Для того, чтобы откат мог быть выполнен гладко, нам также необходимоdownНапишите логику для отмены операции переименования в методе.
public function up()
{
    Schema::table('user', function (Blueprint $table) {
        //
        Schema::rename('users','user');
    });
}
  • окончательное исполнениеphp artisan migrateЗатем вы можете завершить переименование пользовательской таблицы. Если вам нужно откатиться, просто сделайтеphp artisan migrate:rollback.

Вы обнаружите, что если вы выполните миграцию, если вы выполните вторую миграцию, она не будет повторяться, потому что Laravel создаст базу данных в базе данных.migrationsтаблица для записи того, какие из них были перенесены.

Базовое введение в миграцию находится здесь. Приведенный выше контент может удовлетворить большинство потребностей. Если вам нужно более подробное введение, вам может понадобиться прочитать непонятную документацию Laravel. :)

Seeder

Помимо миграции, в Laravel также есть сидер, который используется для заполнения данных. Предполагая, что при разработке проекта необходимы некоторые тестовые данные, тестовые данные также можно заполнить, написав php-код, затем с помощью кода синхронизации git у всех могут быть одинаковые тестовые данные.

Точно так же заполнение данных называется сеялкой в ​​Laravel.Если вам нужно заполнить таблицу данными, вам нужно сначала создать сеялку. выполнивphp artisan make:seeder UserTableSeederдля создания класса сеялки. Здесь мы хотим заполнить тестовую таблицу представления данных, поэтому имяUserTableSeeder. Конечно, имя не обязательно, просто чтобы его знали.

После создания UserTableSeederdatabase/seedersсоздать каталогUserTableSeederкласс, этот класс имеет только один метод запуска. ты сможешьrunметод написания кода для вставки в базу данных. Предположим, мы используем фасад БД для вставки данных в тестовую таблицу.

class UserTableSeeder extends Seeder
{

    public function run()
    {
        DB::table('users')->insert($insertData);
    }
}

После написания кода выполнитеphp artsian db:seeder --class= UserTableSeederдля заполнения данных. После завершения выполнения убедитесь, что в базе данных уже есть данные.

Если у нас есть несколько таблиц для заполнения данными, невозможно выполнить одну за другой после написания php-кода.php artisan db:seeder --class=xxxxзаполнить. Есть простой способ. существуетDatabaseSeederизrunдобавить строку в метод$this->call(UserTableSeeder::class);, затем выполнитеphp artisan db:seeder, тогда Laravel выполнитDatabaseSeederсерединаrunметод, а затем выполните миграции одну за другой.

В отличие от миграции, если выполняется несколько разphp artisan db:seederЗаполнение данных будет выполняться многократно.

Если вы хотите вставить большое количество тестовых данных за один раз, то вrunИспользование фасада БД для вставки одного за другим в метод, очевидно, не является хорошим подходом. Laravel предоставляетфабрика моделейспособ создания большого количества данных.

фабрика моделей

Фабрика моделей означает, что сущность на самом деле является фабричным шаблоном. Итак, есть две вещи, которые вам нужно сделать, чтобы создать данные с помощью фабрики моделей.

  1. Создайте фабрику и определите данные, которые должны быть возвращены фабрикой.
  2. Позвоните на завод, чтобы получить данные.

В Laravel, выполнивphp artisan make:factory UserFactory --model=UserЧтобы создать фабричный класс для пользовательской модели, этот файл будет помещен вdatabase/factoryПод содержанием. Откройте файл, и вы увидите следующий код:

$factory->define(App\User::class, function (Faker $faker) {
    return [
        //
    ];
});

Здесь значение возврата — это данные, полученные при вызове фабрики на шаге 2. Логику генерации данных тоже нужно только прописать в функции замыкания. Здесь необходимо упомянуть класс Faker. Это сторонняя библиотека, Laravel интегрирует еесторонняя библиотека. То, что делает эта библиотека, забавно: ** для генерации поддельных данных. **Предполагая, что 100 пользователей должны быть вставлены в таблицу User, тогда необходимо 100 имен пользователей, тогда вам не нужно писать логику для генерации большого количества test01, test02 таких наивных поддельных данных, использование класса Faker напрямую будет генерировать много реалистичных данных для вашего имени пользователя. (Не знаю, скучно это или нет :). . . ).

Теперь предположим, что в таблице User есть три поля: идентификатор, электронная почта, имя пользователя, затем я хочу сгенерировать 100 пользователей, сначала внедрив логику в фабричном классе.

$factory->define(App\Models\User::class, function (Faker $faker) {
    return [
    	// 直接调用 faker API 生成假数据,更多 faker 相关查看 文档。
        'username' => $faker->name,
        'email' => $faker->unique()->safeEmail,
    ];
});

Теперь, когда мы определили фабрику, мы собираемсяUserSeeder@runФабрика моделей используется в функции для генерации тестовых данных.


class UserTableSeeder extends Seeder
{

    public function run()
    {
        factory(App\User::class)->times(10)->make()->each(function($user,$index){
        	$user->save();
        });
    }
}

runЭта волна цепных вызовов в функции тоже была черной полосой, когда я впервые начал связываться с Laravel, но после того, как я к ней привык, я почувствовал, что код действительно очень читабелен.

  • factory(App\User::class)Указать какой завод вернуть, параметрApp\User::classЭто уникальный идентификатор завода. Здесь мы определяем фабрикуdefineПервый параметр уже указан.
  • ->times(10)Указывает, что для создания 10 пользовательских данных требуется заводской шаблон. будет вызван 10 разdefineВторой параметр функции.
  • ->make()Инкапсулируйте сгенерированные 10 пользовательских данных в объект коллекции в Laravel.
  • ->each()это функция в коллекции Laravel,eachФункция работает с каждым элементом коллекции. Здесь данные напрямую сохраняются в базе данных.

Вот и все основные операции переноса и заполнения данных. Более сложное использование. . . . Не обязательно пригодный для использования.