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

loz*_*Omr 5 pivot-table laravel laravel-4

我有以下表用户,角色和数据透视表role_user具有以下表结构

用户

  • ID
  • 用户名
  • 密码

角色

  • ID
  • 角色

ROLE_USER

  • ID
  • ROLE_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)
                ));
                }
            }
    
    Run Code Online (Sandbox Code Playgroud)

数据透视表是使用的种子 DB select

有没有更好的方法来种子表,包括数据透视表?

我想也许当我播种我的用户表时,它也将播种role_user表,而不是手动将数据插入数据透视表.

例:

角色

  • id = 1
  • role =编码器
  • id = 2
  • 角色=技术
  • id = 3
  • 角色=销售

用户

  • id = 1
  • 用户名=用户
  • 密码=通过
  • 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'
));
Run Code Online (Sandbox Code Playgroud)

The*_*pha 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
Run Code Online (Sandbox Code Playgroud)

我已经用过[]而不是array(),如果你PHP之前就ver-5.4应该使用array().


Jar*_*zyk 7

出于测试目的,我使用非常简单快速的方法,如下所示.

想象一下,我们拥有带有数据透视表的用户和类别(这来自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)
        ]);
    }
Run Code Online (Sandbox Code Playgroud)