2014-02-05 2 views
29

내 응용 프로그램에는 사전 등록 된 데이터 집합이 필요합니다. 그래서 응용 프로그램을 설정할 때 데이터베이스에 삽입해야합니다.Laravel : 프로덕션 데이터를위한 마이그레이션 및 시드

  • Database migrations :

    Laravel 는 두 가지 메커니즘 제안 ". 그들은 팀이 데이터베이스 스키마를 수정하고 현재 스키마 상태에 대한 최신 정보를 받아 볼 수 있도록"

  • Database seeding : "Laravel에는 시드 클래스를 사용하여 데이터베이스에 테스트 데이터를 입력하는 간단한 방법이 포함되어 있습니다."

이 설명을 읽었을 때 이들 해결책 중 어느 것도 적합하지 않은 것으로 보입니다.

비슷한 질문은 asked on stackoverflowanswered입니다. 대답은 데이터베이스 시더를 사용하여 현재 환경을 탐지하여 데이터베이스를 채우는 것을 제안합니다.

<?php 

class DatabaseSeeder extends Seeder { 

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

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

} 

물론이 솔루션이 작동합니다. 그러나 나는 이것을 수행하는 올바른 방법이라고 확신하지 못합니다. 왜냐하면 시이더를 사용하여 데이터를 삽입하면 마이그레이션 메커니즘 (데이터베이스 업그레이드, 롤백 ...)에 의해 제공되는 모든 이점을 잃어 버리기 때문입니다. 이 경우 모범 사례입니다.

+0

Laravel에서 마이그레이션은 데이터 관리가 아닌 스키마 관리에 관한 것입니다. 시더는 테스트 데이터를 제공하는 데 사용되지만 생산 데이터 로딩 메커니즘이 될 것이라고는 생각하지 않습니다. – warspite

+2

@warspite 그래, 문서가 말하는 것입니다. 이것이 내가이 질문을하는 이유입니다. – gontard

+2

어쩌면이 패키지가 도움이 될 것입니다 https://github.com/slampenny/SmartSeeder –

답변

46

래벨 개발은 자유에 관한 것입니다. 따라서 프로덕션 데이터베이스를 시드하고 DatabaseSeeder가 가장 적합한 위치라고 생각하면 왜 안됩니까?

좋아요, 시더는 주로 테스트 데이터와 함께 사용되지만, 여러분은 그것을 사용하는 사람들을 보게 될 것입니다. 이 내 데이터베이스 테이블에서 수 없으며 artisan migrate 매번 내 응용 프로그램의 새 버전을 배포 실행되는 일이 있기 때문에

나는, 내 마이그레이션의 일환으로 씨앗이 중요한 종류를보고, 그래서 난 그냥

php artisan migrate:make seed_models_table 

그리고 내 seedind 물건을 만들기 :

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

    DB::table('models')->insert($models); 
} 
+0

답장을 보내 주셔서 감사합니다. 나는 이주를 사용하여 씨를 뿌릴 것이다. – gontard

+0

이것은 훌륭한 대답입니다. 마이그레이션은 스키마를 관리하지만 때로는 데이터를 이동해야하는 경우가 있습니다. 이 모든 작업은 엄격한 순서로 수행해야하며 마이그레이션은이 순서를 적용 할 수 있습니다. – Jason

22

나는 종종 나 자신이에 대한 정답이 무엇인지 궁금 발견했습니다. 개인적으로, 필자는 이미 존재하는 무언가를 채우려는 시도를하지 않기 위해 조건부 논리의로드를 넣어야하므로 시드 (seeding)를 사용하여 데이터베이스의 필수 행을 채우는 것을 분명히했습니다. (삭제하고 데이터를 다시하는 것은 당신이 키 불일치로 끝날 수 있기 매우 권할이며 계단식을 사용하는 경우 것은 실수 내 실수를 데이터베이스의 부하를 닦아 수 있습니다 삭제합니다! ;-)

내가 넣어 ' 기회가 될 때마다 마이그레이션 스크립트에 행을 "시드 (seeding)"하여 데이터가 롤아웃 프로세스의 일부로 있어야합니다.

Eloquent 모델 대신 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(); 
} 

이 후 처음 만들 때 마을 테이블 쉽게 '씨앗'에 나를 수 있으며 못해에 대한 모든 추가 방해 런타임에.

+0

당신의 공헌에 감사드립니다. 나는 지금 마이 그 레이션을 사용하고 있으며 데이터를 시드 할 올바른 위치라고 생각합니다. – gontard

+2

모델 번호 – alariva

+1

대신 DB를 사용하는 흥미로운 점 이것이 1 년이 넘었다는 것을 알고 있지만 위의 내용이 실제로 작동합니까? 테이블에 삽입 할 때 "created_at"및 "updated_at"필드를 포함하지 않으므로 "null이 아닌 위반"이 발생한다고 생각합니다. – Thelonias

관련 문제