Моему приложению нужен предварительно зарегистрированный набор данных для работы. Поэтому мне нужно вставить их в базу данных при настройке приложения.
Laravel предлагает два механизма:
Когда я прочитал это описание, ни одно из этих решений, похоже, не адаптировано.
Аналогичный вопрос задан в stackoverflow и ответил . В ответе предлагается использовать сеялку базы данных для заполнения базы данных путем обнаружения текущей среды:
<?php class DatabaseSeeder extends Seeder { public function run() { Eloquent::unguard(); if (App::environment() === 'production') { $this->call('ProductionSeeder'); } else { $this->call('StagingSeeder'); } } }
Конечно, это решение работает. Но я не уверен, что это правильный способ сделать это, потому что, вставляя данные с помощью сеялок, вы теряете все преимущества, предоставляемые механизмом миграции (восстановление базы данных, откат …)
Я хочу знать, какова наилучшая практика в этом случае.
Развитие Ларавеля – это свобода. Итак, если вам нужно засеять вашу производственную базу данных и подумайте, что DatabaseSeeder – лучшее место для этого, почему бы и нет?
Хорошо, сеялка в основном используется с тестовыми данными, но вы увидите, что некоторые люди используют ее как есть.
Я вижу этот важный вид семян как часть моей миграции, так как это то, что не может быть из моих таблиц базы данных, и artisan migrate
каждый раз, когда я развертываю новую версию своего приложения, поэтому я просто делаю
php artisan migrate:make seed_models_table
И создайте в нем мои семена:
public function up() { $models = array( array('name' => '...'), ); DB::table('models')->insert($models); }
Я часто задавался вопросом, какой правильный ответ на это. Лично я избегаю использования семян для заполнения требуемых строк в базе данных, так как вам придется наложить нагрузку условной логики, чтобы убедиться, что вы не пытаетесь заполнить что-то, что уже есть. (Удаление и повторное создание данных очень нецелесообразно, так как вы можете столкнуться с ключевыми несоответствиями, и если вы используете каскадные удаления, вы можете случайно стереть нагрузку своей базы данных на мою ошибку! 😉
Я поместил «посев» строк в сценарий миграции, так как есть шансы, данные должны быть там как часть процесса развертывания.
Стоит отметить, что вы должны использовать класс DB вместо моделей Eloquent для заполнения этих данных, поскольку ваша структура классов может со временем меняться, что не позволит вам повторно создавать базу данных с нуля (без перезаписи истории и изменения файлов миграции, которые Я уверен, это плохо.)
Я хотел бы пойти с чем-то вроде этого:
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(); }
Это позволяет мне легко «посеять» городской стол, когда я его впервые создаю, и не вмешиваюсь в какие-либо дополнения, сделанные им во время выполнения.