播种数据透视表的更好方法

时间:2014-05-02 16:52:21

标签: laravel laravel-4 pivot-table

我有以下表用户角色和数据透视表 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
  • role = encoder
  • id = 2
  • role = tech
  • id = 3
  • role = sales

用户

  • id = 1
  • username = user
  • 密码=传递
  • id = 2
  • username = user2
  • 密码= pass2

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

修改

我正在使用此Eloquent播种我的用户表。 无论如何,在为用户播种时,role_user也会更新吗?

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

3 个答案:

答案 0 :(得分:8)

你可以尝试这个(假设你已经播种了角色):

$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()

答案 1 :(得分: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)
        ]);
    }

答案 2 :(得分: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)用户之间随机创建并随机创建将他们分配到不同的小组。

如果有什么不清楚,请告诉我。