2013-06-30 18 views
1

"goals"와 "partgoals"라는 두 개의 테이블이있는 데이터베이스를 만들었습니다. 실제적인 사용은 저축 목표 (돈)를 만들고 그 길을 따라 이정표를 세우는 것입니다 (부분 목표). Partgoals가 분명히 특정 목표에 연결되기를 바랍니다. 관계가 생성되지만 시드 데이터를 만들려고 할 때 문제가 발생합니다. 이 같은Laravel 4, 관계를 사용하여 테이블에 시드 데이터를 만드는 방법은 무엇입니까?

<?php 

class GoalsTableSeeder extends Seeder { 

    public function run() 
    { 
     DB::table('goals')->delete(); 


     $goals = array(
      array(
       'max'  => 1850000, 
       'avgsav' => 3500, 
       'duedate' => date('2015-03-15'), 
       'created_at' => new DateTime, 
       'updated_at' => new DateTime, 
      ), 
      array(
       'max'  => 1100000, 
       'avgsav' => 5000, 
       'duedate' => date('2013-11-15'), 
       'created_at' => new DateTime, 
       'updated_at' => new DateTime, 
      ) 
     ); 

     DB::table('goals')->insert($goals); 
    } 

} 

그리고 내 partgoals 테이블 (PartgoalsTableSeeder.php) :

<?php 

class PartgoalsTableSeeder extends Seeder { 

    public function run() 
    { 
     DB::table('partgoals')->delete(); 


     $partgoals = array(
      array(
       'id' => 1, 
       'milestone'  => 100000, 
       'duedate' => date('2014-03-15'), 
       'created_at' => new DateTime, 
       'updated_at' => new DateTime, 
      ), 
      array(
       'id' => 1, 
       'milestone'  => 20000, 
       'duedate' => date('2013-06-15'), 
       'created_at' => new DateTime, 
       'updated_at' => new DateTime, 
      ), 
      array(
       'id' => 2, 
       'milestone'  => 400000, 
       'duedate' => date('2013-09-15'), 
       'created_at' => new DateTime, 
       'updated_at' => new DateTime, 
      ), 
      array(
       'id' => 2, 
       'milestone'  => 200000, 
       'duedate' => date('2014-10-15'), 
       'created_at' => new DateTime, 
       'updated_at' => new DateTime, 
      ) 
     ); 

     DB::table('partgoals')->insert($partgoals); 
    } 

} 

마이그레이션 테이블

내 목표는 테이블이 같은 두 가지 목표 (GoalsTableSeeder.php)를 설정하는 것입니다

<?php 

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

class CreateGoalsTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('goals', function(Blueprint $table) 
     { 
      $table->increments('id'); 
      $table->integer('max'); 
      $table->float('avgsav'); 
      $table->date('duedate'); 
      $table->timestamps(); 
     }); 
    } 

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

} 

partgoals에 대한 마이그레이션 테이블 :

01 "목표"에 대한
<?php 

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

class CreatePartgoalsTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('partgoals', function(Blueprint $table) 
     { 
      $table->foreign('id') 
       ->references('id')->on('goals') 
       ->onDelete('cascade'); 
      $table->increments('id'); 
      $table->float('milestone'); 
      $table->date('duedate')->nullable(); 
      $table->timestamps(); 
     }); 
    } 

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

} 

내가 뭘 잘못하고 있니? 저는 Laravel (및 Laravel 4)을 처음 사용합니다.

+0

두 개의 테이블에 대한 씨앗을 생성하는 방법에 대한이 문서를 참조 할 수 있습니다를 다음과 같이 ModelFactory.php

$factory->define(App\Category::class, function (Faker\Generator $faker) { $name = $faker->name; return [ 'name' => $name, 'visible' => 1 ]; }); $factory->define(App\Video::class, function (Faker\Generator $faker) { return [ 'title' => $faker->name, 'description' => '', 'status' => 1 ]; }); 

그런 다음 시더 클래스가 될 수 있습니다 당신이 가진 문제를 설명합니다. 특정 오류 메시지/경고가 있습니까? 귀하의 데이터가 존재하지 않거나 예상대로입니까? – Chris

+0

죄송합니다, 처음에는 더 이상 보이지 않는 것 같았습니다.) 콘솔에서이 문제가 발생했습니다 : [예외] SQLSTATE [23000] : 무결성 제약 조건 위반 : 1062 'PRIMARY'키에 중복 항목 '1'(SQL : 을 삽입하십시오. (예 : id, milestone, duedate, created_at, updated_at) 값 (?,?,?,?), (?,? ,?,?,?) (?,?,?,?), (?,?,?,?,?)) 삽입하려는 데이터와 함께. –

답변

0

나는 Laravel에 익숙하지 않거나 당신이하려는 일을하고 있지만 주석에 추가 한 오류에 따라 동일한 기본 키로 여러 레코드를 입력하려고 시도한 결과 인 것 같습니다 (1)을 (를) partgoals 테이블에 추가하십시오.

테이블을 어떻게 설정했는지 확실하지 않지만 고유 한 기본 키 열 ID이있는 partgoals 테이블을 정의한 것 같습니다.이 외래 키로도 사용하려고합니다. goals 테이블을 참조하십시오. partgoals 테이블에 외래 키를 보관할 다른 필드를 만드는 것이 좋습니다.

1

쿼리 작성기에서 increments을 사용하면 자동으로 기본 키가 자동 증가되고 고유합니다. 일대일 관계가 아니면 외래 키를 기본 키로 사용할 수 없습니다. 그것은 단지 나쁜 디자인이다. 스키마는 다음과 같아야합니다. 파종 할 때

Schema::create('partgoals', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->foreign('goal_id') 
      ->references('id')->on('goals') 
      ->onDelete('cascade'); 
     $table->float('milestone'); 
     $table->date('duedate')->nullable(); 
     $table->timestamps(); 
    }); 

또한, 당신이 insertGetId를 삽입 할 때 사용하는 경우, 당신이 방금 삽입 한 레코드의 ID를 반환합니다. 나중에 다른 테이블에 삽입하는 것과 같이 다른 삽입에서 사용할 수 있습니다. 그러나이 작업은 동일한 스크립트에서 수행되어야합니다. 다시 DatabaseSeeder으로 전달한 다음 다른 시드 스크립트로 되돌릴 수는 있지만 시도하지는 않았습니다.

1) 작성 방법 외래 키
외래 키 제약 조건을 지정하면 해당 열 unsignedInteger을해야합니다

4

나는 당신의 코드 몇 가지 문제를 참조하십시오.
아래 코드에서 'id'라는 두 개의 열 이름을 변경 한 실수를 수정합니다. 당신이 외부 키를 지정하는 경우

Schema::create('partgoals', function(Blueprint $table) 
    { 
     $table->increments('id');   
     $table->unsignedInteger('goal_id'); 
     $table->foreign('goal_id') 
      ->references('id')->on('goals') 
      ->onDelete('cascade'); 
     $table->float('milestone'); 
     $table->date('duedate')->nullable(); 
     $table->timestamps(); 
    }); 


2) 방법 당신은 테이블 시더의 항목을 만들 때 값을 선언해야, 데이터베이스
씨앗.
NULL 값을 지정하려면 열에 이러한 값을 허용하도록 허용하면됩니다 (기본적으로 그렇지 않습니다). 이 경우, 우리는 당신이

+0

Laravel 파일 구조에서이 파일은 어디에 있습니까? –

+0

@AndrewKoper'app/database/migrations' – lozadaOmr

+0

"항목을 만들 때 값을 선언하십시오"라는 의미의 예를 들어 줄 수 있습니까? 또한 관계형 데이터베이스를 시드하려고합니다. – Notflip

0

당신의 씨 뿌리는 두 번 'id' => 1을 전달하는 관계 테이블을 시드 ->nullable()->default(NULL)

Schema::create('partgoals', function(Blueprint $table) 
    { 
     $table->increments('id');   
     $table->unsignedInteger('goal_id')->nullable()->default(NULL); 
     $table->foreign('goal_id') 
      ->references('id')->on('goals') 
      ->onDelete('cascade'); 
     $table->float('milestone'); 
     $table->date('duedate')->nullable(); 
     $table->timestamps(); 
    }); 

사소한 실수
3)를 추가해야합니다, 당신은에 정의 된 모델 공장에 필요 ModelFactory.php 파일을 만든 다음 시드를 실행하는 시드 자 클래스를 만듭니다.

예 :

<?php 

use Illuminate\Database\Seeder; 

class CategoriesTableSeeder extends Seeder 
{ 
    /** 
    * Run the database seeds. 
    * 
    * @return void 
    */ 
    public function run() 
    { 
     $categories = factory(App\Category::class, 20)->create()->each(function ($u) { 
       for ($i=0; $i<5; $i++) 
       { 
        $u->videos()->save(factory(App\Video::class)->make()); 
       } 
      }); 
    } 
} 

당신은 당신은 아마 혜택을 줄 관계 http://deepdivetuts.com/seeding-two-tables-using-laravel-5-3