Laravel: Миграции & Посев данных производства

голоса
31

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

Laravel предложить два механизма:

  • Миграции базы данных : «Они позволяют команде изменить схему базы данных и оставаться в курсе текущего состояния схемы.»
  • Посев базы данных : «Laravel также включает в себя простой способ потомству базы данных с тестовыми данными с использованием классов семян.»

Когда я прочитал это описание, ни одно из этих решений не кажется, адаптировано.

Аналогичный вопрос был спросил на StackOverflow и ответил . Ответ предлагает использовать сеялку базы данных для заполнения базы данных пути определения текущей среды:

<?php

class DatabaseSeeder extends Seeder {

    public function run()
    {
            Eloquent::unguard();

            if (App::environment() === 'production')
            {
                $this->call('ProductionSeeder');
            }
            else
            {
                $this->call('StagingSeeder');
            }
    }

}

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

Я хочу знать, что это лучшая практика в данном случае.

Задан 05/02/2014 в 12:32
пользователем
На других языках...                            


3 ответов

голоса
48

Развитие Laravel о свободе. Так что, если вам нужно семена базы данных производства и думают DatabaseSeeder это лучшее место, чтобы сделать так, почему бы и нет?

Хорошо, сеялка в основном для использования с тестовыми данными, но вы будете видеть некоторые люди, используя его, как вы.

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

php artisan migrate:make seed_models_table

И создать свой seedind вещи в нем:

public function up()
{
    $models = array(
        array('name' => '...'),
    );

    DB::table('models')->insert($models);
}
Ответил 05/02/2014 в 13:00
источник пользователем

голоса
23

Я часто задаюсь вопросом , что правильный ответ на это. Лично я бы держаться подальше от использования высева для заполнения необходимых строк в базе данных , как вам придется поставить груз условной логики , чтобы убедиться , что вы не пытаетесь заполнить что - то , что уже есть. (Удаление и воссоздание данных является очень нежелательным , как вы могли бы в конечном итоге с ключевыми несовпадениями и если вы используете каскадные удаления вы можете случайно стереть груз базы данных моей ошибки! ;-)

Я поставил «посев» строк в скрипт миграции как возможности, данные должны быть там, как часть процесса свитка.

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

Я склонен идти с чем-то вроде этого:

public function up()
{
    DB::beginTransaction();

    Schema::create(
        'town',
        function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        }
    );

    DB::table('town')
        ->insert(
            array(
                array('London'),
                array('Paris'),
                array('New York')
            )
        );

    Schema::create(
        'location',
        function (Blueprint $table) {
            $table->increments('id');
            $table->integer('town_id')->unsigned()->index();
            $table->float('lat');
            $table->float('long');
            $table->timestamps();

            $table->foreign('town_id')->references('id')->on('town')->onDelete('cascade');
        }
    );

    DB::commit();
}

Затем это позволяет мне «семени» таблица города легко, когда я первый его создания, а также не мешать с любыми дополнениями к нему во время выполнения.

Ответил 13/06/2014 в 12:29
источник пользователем

голоса
1

Это то, что я использую в производстве.

Так как я бегу миграции на каждом развертывании

artisan migrate

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

php artisan make:seeder YourTableSeeder

а затем вызвать его в миграции.

class YourTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {    
        $seeder = new YourTableSeeder();
        $seeder->run();
    }

    /**
    * Reverse the migrations.
    *
    * @return void
    */
    public function down()
    {
    }
}

Я не добавить этот посевного вызов семян / DatabaseSeeder.php, чтобы избежать запуска дважды на новой установке.

Ответил 16/01/2019 в 23:52
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more