2017-05-23 2 views
3

생성() 또는합니다Laravel 공장의 관계는 ... 존중 Laravel의 <a href="https://laravel.com/docs/5.4/database-testing#relationships" rel="nofollow noreferrer">documentation on defining relationships within model factories</a>에 따르면()

또한 폐쇄가 공장 정의 속성을 사용하여 모델의 관계를 첨부 할 수 있습니다. 당신이 포스트를 만들 때 새로운 사용자 인스턴스를 생성하려는 경우 예를 들어, 당신이 할 수있는 다음과 같은 :

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

내가 실행 해요 문제는 내 create()에 대한 참조입니다 관계 정의. 이것이 나에게 속하지 않는 것처럼 보입니다.

그것은 내가 데이터베이스에 대한 나의 관계를 유지하고자하고 있다면 좋은 작품 : 생성 될이 바로 위에 새로운 App\Post 새로운 App\User를 코드를 실행하여

factory(App\Post::class)->create(); 

을 모두 데이터베이스에 지속 .

하지만 난 그냥 모델 (들)를 new를 실행하여 데이터베이스에 어떤 (모든) 유지되지하려면 :

factory(App\Post::class)->make(); 

그것은 내가 특정 시점까지 원하는 것을. 새로운 App\Post 인스턴스가 생성되었지만 지속되지는 않지만 App\Comment이 생성되어 데이터베이스에 유지됩니다.

$factory->define(App\Post::class, function ($faker) { 
    return [ 
     'title' => $faker->title, 
     'content' => $faker->paragraph, 
     'user_id' => function() { 
      // here I only want to declare the relationship, 
      // not decide whether I want to create() or make() 
      // the relationship, something like: 
      return factory(App\User::class)->createOrMake()->id; 

      // or perhaps something like: 
      return factory(App\User::class)->id; 
     } 
    ]; 
}); 

최종 결과는 내가이에서 할 노력하고있어 존중하기 위해 관련 데이터를 원하는 것입니다 :


내가 정말 원하는 것은이 같은 것을 나에게 보인다 통화 상단. 모든 것을 만드십시오. 또는 모든 것을 만들 수 있습니다.


여기에 뭔가 잘못입니까? 아니면 현재 존재하지 않는 무언가입니까?

감사합니다.

답변

0

는 당신이,이 솔루션은 나를 위해 일한으로

내가 같은 문제를 가지고이 방법을 시도하지만, 그 이유를 찾을 수 없습니다.

$factory->define(App\Post::class, function ($faker) { 
    return [ 
     'title' => $faker->title, 
     'content' => $faker->paragraph, 
     'user_id' => function() { 
      $user = factory(App\User::class)->make(); 
      $id = $user->id; 
      $user->save(); 
      return $id; 
     } 
    ]; 
}); 
0

관련 모델에 대해 lazy() 메소드를 원한다!

적어도 Laravel 5.5.

동일한 문제가있어서 여기에서 질문을 찾았습니다. 나는 Laravel의 아름답게 작성된 코드 덕분에 답을 찾았습니다. lazy()는 make()의 바로 위에 정의되었습니다. XDebug가 저를 데려갔습니다. 시도해 보았습니다.

내가 뭘하는지입니다 :

$factory->define(App\ArtItem::class, function (Faker $faker) { 
    return [ 
     // 'id' => $faker->randomDigit, 
     'slug' => $faker->unique->word, 
     'artist_id' => factory(App\Artist::class)->lazy(), 
     'image_id' => factory(App\Image::class)->lazy(), 
     'created_at' => $faker->dateTime, 
     'updated_at' => $faker->dateTime, 
     'deleted_at' => $faker->dateTime, 
    ]; 
}); 

게으른()가 폐쇄를 반환하는 흥미로운 생물, 당신은 factory(App\Image::class)->lazy()->id을 할 수 있도록하지만, 난 여전히 성공적으로 올바른 image_id 설정을보고 있어요 및 artist_id.

필자는이 솔루션을 오래 전에 찾았 으면 좋겠지 만, 아마도 다른 사람을 도울 것입니다.