2016-11-27 72 views
1

最近,我一直試圖使用Laravel種子模型工廠和Faker來種子我的數據庫。用模型工廠,一對一和一對多關係定義Laravel外鍵而不會創建不必要的模型

對於簡單的模式,它只是一件輕而易舉的工作:)。然而,其中涉及外鍵的複雜的數據庫模式和表之間的關係工作時,我遇到了幾個問題:

  • 一對一
  • 一對多
  • 多對多

...就像鏈接中描述的那樣: 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()); 
    }); 
} 

...但有一個問題,這個解決方案:與許多數據庫表和運行許多種工作時(以它們之間有很多關係),所以很常見使用這種方法創建許多不必要的模型。例如,如果我們在上面的例子之前運行PostsTableSeeder.php,那麼所有這些帖子都不會被鏈接到用戶,並且永遠不會被用於測試和開發中...

因此,搜索處理這種情況的方式,我已經找到了一個適用於我的功能性解決方案,並避免了那些'孤兒'模型的不必要的創建...

我想與大家分享,所以它只是解釋在答案:)。

回答

8

因此,這裏是我的解決方案:

的例子有涉及:

  • 用戶&型材(爲了說明一對一關係)
  • 用戶&帖子(用於說明一對多關係臀部)

    // 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表來解決多對多。我試圖寫一個工廠來播種我的數據庫。 – Kenilik

+1

我在播種機內獲得**多對多**的方法,而不是工廠......在播種機中,您需要簡單地檢索兩個模型(*用戶*和*個案*),並通過其中一個指派另一個模型(s)在每種情況下。 – 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

相關問題