2014-05-02 4 views
5

von Seeding habe ich die folgenden Tabellen Benutzer, Rollen und die Pivot-Tabelle role_user mit der folgenden Tabelle Strukturbesserer Weg, um eine Pivot-Tabelle

Benutzer

  • id
  • Benutzername
  • passwort

Rollen

  • id
  • Rolle

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) 
          )); 
          } 
         } 
    

Die Pivot-Tabelle DB select

Gibt es einen besseren Weg, um die Tabellen zu impfen, einschließlich der Pivot-Tabelle verwendet, wird geimpft?

Ich dachte, vielleicht, wenn ich meine Benutzer-Tabelle säen, wird es auch die Tabelle role_user säen, anstatt die Daten manuell in die Pivot-Tabelle einzufügen.

Beispiel:

Rollen

  • id = 1
  • role = Encoder
  • id = 2
  • role = tech
  • id = 3
  • role = Verkäufe

Benutzer

  • id = 1
  • username = user
  • password =
  • id = 2
  • username = benutzer2
  • password = pass2

passieren role_user

  • id = 1
  • User_id = 1
  • role_id = 1
  • id = 2
  • User_id = 1
  • role_id = 2
  • id = 3
  • User_id = 2
  • role_id = 3

bearbeiten

ich meine Benutzer-Tabelle dieses Eloquent unter Verwendung der Aussaat. Gibt es trotzdem, dass der role_user beim Seeding des Users auch aktualisiert wird?

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

Antwort

6

können Sie versuchen, diese (Unter der Annahme, dass Sie bereits Rollen ausgesät haben):

$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 

I [] statt array() verwendet haben, wenn Ihr PHP-ver-5.4 vor, dann sollten Sie array() verwenden.

+0

Das schafft nicht die Rollen, und 'attach()' Sie auf einen Datensatz beschränken? Sie müssten also mehrere Einfügungen ausführen, um einem Benutzer mehrere Rollen hinzuzufügen. – ollieread

+0

Rollen werden bereits gemäß dem betreffenden Code erstellt und nur mit erstellten Rollen verknüpft. –

+0

Ich dachte, er möchte jedem Benutzer eine Rolle zuweisen, aber für mehrere Rollen sollte 'sync' verwendet werden, danke @ollieread :-) –

1

Ich bin nicht sicher, wie andere darüber fühlen, aber wenn die Datenbank Impfen, Ich mag die aktuellen Modelle für die Aussaat verwenden, so Sie alle praktischen Funktionen verwenden können, die mit Einfügen von verwandten Modelle kommen .

Wenn Sie den Benutzer und die Rollen mit vordefinierten IDs säen, ist es einfach.

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); 
    } 

} 

In einer aktuellen Anwendung, die ich geschrieben habe, habe ich eine Sämaschine, die die ACL-Gruppen erstellt, dann Berechtigungen, die Berechtigungen auf die spezifischen Gruppen zugeordnet, dann zwischen 10-30 zufällig irgendwo erstellt (mit rand) Benutzern und zufällig hat sie verschiedenen Gruppen zugewiesen.

Lassen Sie mich wissen, wenn etwas unklar ist.

+0

Ja verwende ich eloquent. Ich habe auch meine Frage bearbeitet. – lozadaOmr

+0

Ausgezeichnet. Werden die Benutzer auch gesetzt? Wie in, ist das völlig zufällig Testdaten oder ist diese Produktion bereit Daten? – ollieread

+0

Ja, die Benutzer werden gesetzt, dies nur zum Testen von Daten. – lozadaOmr

6

Für Testzwecke verwende ich ziemlich einfache und schnelle Methode wie unten.

Stellen wir haben Benutzer und Kategorien mit Pivot-Tabelle (das kommt von JeffreyWay der Generatoren 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

Kann es aber auch die Beziehung generieren? Es tut mir leid, wenn sich das albern anhören mag, aber ich kenne Faker nicht. – lozadaOmr

+0

Es kann nicht automatisch generiert werden, aber wie Sie in meinem Beispiel sehen können, erfordert es 2 einfache Codezeilen: zufällige ID von 1 bis max, wobei max hardcoded ist. Wirklich, es dauert 5 Minuten, um mehrere Tische auf diese Weise zu säen. –

1

Für n: m Beziehungen, wo ich zufällig Einträge anhängen müssen, verwende ich diese einfache, aber effiziente Seeder Code, der nur echte IDs verwendet:

$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); 
    }