2014-05-02 89 views
5

的更好的辦法,我有以下表用戶角色和數據透視表ROLE_USER用下面的表結構播種透視表

用戶

  • ID
  • 用戶名
  • 密碼

角色

  • ID
  • 作用

ROLE_USER

  • ID
  • ROLE_ID
  • USER_ID

    <?php 
         class PivotTableSeeder extends Seeder { 
          public function run() 
          { 
           // Seeds the roles table 
           DB::table('roles')->delete(); 
    
           DB::table('role_user')->insert(array(
           array('user_id' => 1, 'role_id' => 1), 
           array('user_id' => 2, 'role_id' => 2), 
           array('user_id' => 3, 'role_id' => 1), 
           array('user_id' => 3, 'role_id' => 3), 
           array('user_id' => 3, 'role_id' => 5) 
          )); 
          } 
         } 
    

樞軸表使用種子DB select

有沒有更好的方式來種子表,包括數據透視表?

我在想也許當我播種我的用戶表時,它也會播種role_user表,而不是手動將數據插入到數據透視表中。

實施例:

角色

  • ID = 1
  • 角色=編碼
  • ID = 2
  • 角色=高科技
  • ID = 3
  • 角色=銷售

用戶

  • ID = 1
  • 用戶名=用戶
  • 密碼=傳遞
  • ID = 2
  • 用戶名=用戶2
  • 密碼= PASS2

角色用戶

  • ID = 1
  • USER_ID = 1
  • ROLE_ID = 1
  • ID = 2
  • USER_ID = 1
  • ROLE_ID = 2
  • ID = 3
  • USER_ID = 2
  • role_id = 3

編輯

我用這個雄辯播種我的用戶表。 無論如何,在播種User時,role_user也會得到更新?

User::create(array(
    'id' => '1', 
    'username' => 'user', 
    'password' => 'pass' 
)); 
User::create(array(
    'id' => '2', 
    'username' => 'user2', 
    'password' => 'pass2' 
)); 

回答

6

你可以試試這個(假設你已經播種的角色):

$user = User::create(['id' => '1', 'username' => 'user', 'password' => 'pass']); 
$user->roles()->sync([1,2]); // array of role ids 

$user = User::create(['id' => '2', 'username' => 'user2', 'password' => 'pass2']); 
$user->roles()->sync([3,4]); // array of role ids 

我用[]代替array(),如果你PHP是之前ver-5.4那麼你應該使用array()

+0

這不是創建角色,也不會附加()將您限制爲一條記錄?所以你必須運行多個插入才能爲用戶添加多個角色? – ollieread

+0

角色已根據其代碼創建,僅附加創建的角色。 –

+0

我以爲他想附加一個角色給每個用戶,但多個角色'同步'應該使用,謝謝@ollieread :-) –

1

我不知道別人是怎麼想的,但播種數據庫的時候,我喜歡用實際型號爲播種,這樣你可以使用所有附帶插入相關模型的方便功能。

如果您使用預定義的ID爲用戶和角色播種,那麼很容易。

class UserSeeder extends Seeder 
{ 

    public function run() 
    { 
     DB::table('users')->truncate(); 
     DB::table('roles')->truncate(); 
     DB::table('user_roles')->truncate(); 

     $users = []; 

     $user = User::create(['id' => 1, 'blah' => 'honk']); 
     $users[$user->id] = $user; 
     $user = User::create(['id' => 2, 'blah' => 'honk']); 
     $users[$user->id] = $user; 
     // etc etc 

     $roles = []; 
     $role = Role::create(['id' => 1, 'blah' => 'honk']); 
     $roles[$role->id] = $role; 
     // etc etc 

     $user[1]->roles()->sync(1); 
     $user[2]->roles()->sync(2); 
     $user[3]->roles()->sync(1, 3, 5); 
    } 

} 

在最近的一個應用程序,我寫的,我創建了一個創建的ACL組,然後權限,分配權限給特定羣體播種機,然後隨機10-30(使用rand)的用戶,隨機介於創建分配給不同的組。

讓我知道是否有什麼不清楚。

+0

是的我使用雄辯。我也編輯了我的問題。 – lozadaOmr

+0

優秀。用戶是否也接種?如在,這是完全隨機測試數據還是這個生產準備好的數據? – ollieread

+0

是的用戶正在播種,這僅用於測試數據。 – lozadaOmr

6

出於測試目的,我使用了非常簡單快捷的方法,如下所示。

試想一下,我們有用戶和類別與透視表(這是來自JeffreyWay的發電機BTW):

<?php 

// Composer: "fzaninotto/faker": "v1.3.0" 
use Faker\Factory as Faker; 

class UsersTableSeeder extends Seeder { 

    public function run() 
    { 
     $faker = Faker::create(); 

     foreach(range(1, 100) as $index) 
     { 
      User::create([ 
       'username' => $username = $faker->userName, 
       'email'  => $faker->email, 
       'password' => Hash::make($username), 
       'account_id' => $index 
      ]); 
     } 
    } 

} 

// all other seeders look the same, so I paste just the code that matters: 
// Categories 
    foreach(range(1, 30) as $index) 
    { 
     Category::create([ 
      'name' => $faker->word 
     ]); 
    } 

// pivot table 
    foreach(range(1, 50) as $index) 
    { 
     DB::table('category_user')->insert([ 
      'category_id' => rand(1,30), 
      'user_id' => $faker->unique()->randomNumber(1, 100) 
     ]); 
    } 
+0

但它能產生包括關係嗎?我很抱歉,如果這聽起來很愚蠢,但我不熟悉使用Faker。 – lozadaOmr

+0

它不能自動生成它,但正如您在我的示例中所看到的,它需要2個簡單的代碼行:從1到max的隨機ID,其中max是硬編碼的。真的,這需要5分鐘種幾張桌子。 –

1

對於N:M的關係,在這裏我需要附加隨機項,我用這種簡單而有效的播種機代碼,只使用實際的ID:

$faker = Faker\Factory::create(); 

    $limit = 100; 

    for ($i = 0; $i < $limit; $i++) { 
     $newrow = *Yourmodel*::create ([ 
      'email' => $faker->word . rand(0, 9999) . '@test.com' , 
      ... 
     ]); 

     $ids = $faker->randomElements(\App\YourOtherModel::select('id')->get()->toArray(), rand(1,*3*)); 
     foreach($ids as $id) { 
      $newrow->*your_relationship*()->attach($id); 
    }