2017-05-23 55 views
3

根據Laravel的documentation on defining relationships within model factoriesLaravel工廠關係...尊重創造()或使()

您也可以用在你的工廠關閉定義附加屬性的關係,以模型。例如,如果你想創建一個帖子時,創建新的用戶實例,你可以做到以下幾點:

$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()關係定義。在我看來,這不屬於這裏。

它的偉大工程,如果我想堅持我的數據庫關係:

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

通過直接運行上面的代碼這一點,新App\Post和新App\User將被創建並都保存到數據庫。

但如果我只是想new建立模型(S)和不運行任何東西繼續存在(的話)到數據庫:

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。

我當然希望你在此之前就能找到解決方案,但也許這會幫助其他人!