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


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

Laravel предлагает два механизма:

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

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

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

<?php

class DatabaseSeeder extends Seeder {

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

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

}

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

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

Author: Community, 2014-02-05

2 answers

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

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

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

php artisan migrate:make seed_models_table

И создайте в нем мой материал seedind:

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

    DB::table('models')->insert($models);
}
 52
Author: Antonio Carlos Ribeiro, 2014-02-05 15:00:05

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

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

Стоит отметить, что вы должны использовать класс 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();
}

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

 27
Author: Dan B, 2014-06-13 13:29:17