Можем ли мы создать миграцию для данных, а не только для структуры таблиц - PullRequest
0 голосов
/ 13 мая 2018

Я люблю laravel из-за способности создавать миграции.

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

Точно так же,

1) Если я хочу, чтобы мои данные (входные данные в таблицу) также сохранялись каким-либо образом, чтобы при каждом изменении данных в базе данных этоможет быть возвращен назад или весь процесс также может быть воссоздан.

2) Если 1 невозможно, то можем ли мы сохранить методы для «начального» заполнения базы данных.(поэтому, когда мы «фабрично» сбрасываем все это, он также может автоматически заполнять содержимое базы данных, а не только структуру базы данных)

Любые ссылки на то же самое, пожалуйста?

Надеюсь, я смог прояснить ситуацию!

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Вы правы, полагая, что Laravel невероятен! Итак, что касается вашего первого вопроса.

1) Если я хочу, чтобы мои данные (входные данные в таблицу) также сохранялись каким-либо образом, так что всякий раз, когда я изменяю данные в базе данных, это также может быть возвращено назад или весь процесс также может быть воссоздан заново.

Если вы хотите воссоздать данные, вам нужно будет создать табличную сеялку. Для этого просто создайте сеялку и фабрику с ремесленником.

php artisan make: сеялка UsersTableSeeder

После создания сеялки вы можете запустить его с помощью команды:

composer dump-autoload && php artisan db: seed

Если вы хотите создать контроллеры, сеялки и фабрики одновременно, когда вы создаете модель, наберите эту ремесленную команду.

php artisan make: модель User -fa

Подробнее о документации по созданию сеялок и фабрик можно узнать в Laravel здесь .

Вместо того, чтобы связываться с вашими файлами миграции, я бы создал сеялки. Вот пара примеров.

Приложение 1 - Пример фабрики товаров (база данных / фабрики / ArticleFactory.php)

<?php

use Faker\Generator as Faker;

$factory->define(App\Article::class, function (Faker $faker) {
    return [
        'title' => $faker->text(50),
        'slug' => $faker->unique()->slug,
        'body' => $faker->text(200),
        'user_id' => rand(1,10),
    ];
});

Приложение 2 - Пример Сеялки статей (база данных / seed / ArticleTableSeeder.php)

<?php

use Illuminate\Database\Seeder;

class ArticlesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Article::class, 10)->create();
    }
}

Приложение 3 - Пример переноса статьи (database / migrations / 2018_05_13_create_articles_table.php)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->string('slug');
            $table->integer('media_id')->nullable();
            $table->integer('user_id')->nullable(); // Owner of Article
            $table->timestamps();
            $table->softDeletes();

            $table->index('slug');

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

Приложение 4 - DatabaseTableSeeder.php

    <?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

use Faker\Factory as Faker;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // Disable all mass assignment restrictions
        Model::unguard();


        // Seeds the Articles
        $this->call(ArticlesTableSeeder::class);

Затем, чтобы выполнить полный возврат к заводским настройкам, все, что вам нужно сделать, это набрать следующую команду ремесленника:

php artisan migrate: db --fresh

php artisan db: seed

0 голосов
/ 27 февраля 2019

Хотя вы можете выполнять миграцию данных, используя как файл миграции, так и файл сеялки (как объяснено в ответах выше), из опыта я настоятельно рекомендую вам помещать такой код миграции в файл сеялки, а не в файл миграции.

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

 php artisan migrate --help
Usage:
  migrate [options]

Options:
      --database[=DATABASE]  The database connection to use.
      --force                Force the operation to run when in production.
      --path[=PATH]          The path of migrations files to be executed.
      --pretend              Dump the SQL queries that would be run.
      --seed                 Indicates if the seed task should be re-run.
      --step                 Force the migrations to be run so they can be rolled back individually.
  -h, --help                 Display this help message
  -q, --quiet                Do not output any message
  -V, --version              Display this application version
      --ansi                 Force ANSI output
      --no-ansi              Disable ANSI output
  -n, --no-interaction       Do not ask any interactive question
      --env[=ENV]            The environment the command should run under
  -v|vv|vvv, --verbose       Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  Run the database migrations

вы заметите, что нет возможности запустить вручную подобранную миграцию, что вы, возможно, захотите когда-нибудь сделать с миграцией данных (пример: предположим, что вы просто хотите перенести данные из одной устаревшей таблицы в другую таблицу, подумайте это как перемещение данных из транзакционной базы данных в аналитическую базу данных с использованием ночных заданий cron или чего-либо еще).

Эта опция, однако, доступна в сеялке:

php artisan db:seed --help
Usage:
  db:seed [options]

Options:
      --class[=CLASS]        The class name of the root seeder [default: 

, что делает его гораздо более гибким, чем миграция (не говоря уже о том, что данные заполнения все о данных, что больше подходит для вашей задачи)

0 голосов
/ 13 мая 2018

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

Ответ 2) Первый вопрос возможен

Пример:

public function up()
{
    // Create the table
    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();
    });

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