2016-11-27 8 views
1

최근 Model Factory 및 Faker를 통해 Laravel 시드를 사용하여 데이터베이스를 시드하려고 시도했습니다.불필요한 모델을 만들지 않고 모델 팩토리, 일대일 및 일대 다 관계로 Laravel 외래 키 정의

간단한 스키마의 경우 간단하게 작업 할 수 있습니다. :). 복잡한 외래 키를 포함 DB 스키마 및 테이블 관계 작업 할 때 그러나, 나는 몇 가지 문제가 발생했습니다 :

  • 하나 하나에 많은
  • 많은에 많은

... 링크에 설명 된 것과 같습니다 : Laravel 5.1 foreign keys in model factory. 이 항목의 내용

official documentation이 같은 데이터베이스 씨앗 실행 제안 :

public function run() 
{ 
    factory(App\User::class, 50)->create()->each(function ($u) { 
     $u->posts()->save(factory(App\Post::class)->make()); 
    }); 
} 

을 ...하지만이 솔루션에 한 가지 문제가있다 :과 (많은 DB 테이블과 실행 많은 종자가 작업을 할 때 그들 사이의 많은 관계),이 방법론을 사용하여 많은 불필요한 모델을 생성하는 것이 일반적입니다. . 예를 들어 위 예제의 앞에 PostsTableSeeder.php를 실행했다면 모든 게시물은 사용자와 연결되지 않았으므로 테스트 및 개발에 절대 사용되지 않습니다.

이 상황을 처리 할 수있는 방법을 찾았는데, 나를 위해 작동하는 '고아'모델의 불필요한 생성을 피할 수있는 기능적 해결책을 찾았습니다. ...

그리고 나는 그것을 모든 사람과 공유하고 싶었습니다. 대답 :).

예를 다룬다 : 그래서 여기

답변

8

내 솔루션입니다

  • 사용자 & 프로필
  • 사용자 (하나 하나에 관계를 설명하기위한) & 게시물 (설명을 위해 1 대 다수 관계 엉덩이)

    // ONE TO ONE relationship (with Users already created) 
    $factory->define(App\Profile::class, function (Faker\Generator $faker) { 
        return [ 
         'user_id' => $faker->unique()->numberBetween(1, App\User::count()), 
         // Rest of attributes... 
        ]; 
    }); 
    
    // ONE TO MANY relationship (with Users already created) 
    $factory->define(App\Posts::class, function (Faker\Generator $faker) { 
        $users = App\User::pluck('id')->toArray(); 
        return [ 
         'user_id' => $faker->randomElement($users), 
         // Rest of attributes... 
        ]; 
    }); 
    
+0

많은 관계?나는 많은 것을 해결하기 위해 User_Cases 테이블을 가진 사용자와 케이스를 가지고있다. 나는 내 DB를 뿌리기 위해 공장을 쓰려고 노력하고있다. – Kenilik

+1

나는 공장이 아닌 파종기에서 ** ** ** ** ** ** 많은 접근법을 얻는다. 당신의 파종기에서는 두 모델 (* 사용자 *와 * 사례 *)을 간단히 검색하고 그 중 하나를 통해 다른 모델 (들). – andcl

0

것은 다음은이 모델에 추가 정보를 보낼 필요 특히, 임의의 사용자를 할당하는 것보다 더 나은 방법입니다 관계를 만들 수있는 솔루션입니다.

$factory->define(App\Post::class, function (Faker\Generator $faker) { 
    $user = factory('App\Models\User')->create(['email' => '[email protected],]); 
    // do your relationships here (...) 
    return [ 
     'user_id' => $user->id, 
     'title' => $faker->sentence, 
     'body' => $faker->paragraph, 
     ]; 
    } 

그리고 익명 함수를 사용하여 또 다른 예를 보았다

$factory->define(App\Post::class, function (Faker\Generator $faker) { 
    return [ 
     'user_id' => function() { 
      return factory(App\User::class)->create()->id; 
     }, 
     'title' => $faker->sentence, 
     'body' => $faker->paragraph, 
    ]; 
} 

출처 : 난 당신에게 많은 대해 동일한을 달성하는 가장 좋은 방법을 제안 할 수있다 생각하지 않습니다 https://laracasts.com/series/laravel-from-scratch-2017/episodes/22