【问题标题】:Seed multiple rows at once laravel 5一次播种多行laravel 5
【发布时间】:2015-04-20 01:43:15
【问题描述】:

我目前正在尝试为我的用户表播种。如果我用 2 行这样尝试,它会失败。如果我只使用单个数组而不是 $users 数组中的 2 个数组来创建一些假数据,它就可以正常工作。

我做错了什么,正确的方法是什么?

class UserTableSeeder extends Seeder {

    public function run()
    {
        DB::table('users')->delete();

        $users = [
            ['id' => 1, 'name' => 'Stephan de Vries', 'username' => 'stephan', 'email' => 'stephan-v@gmail.com', 'password' => bcrypt('carrotz124')],
            ['id' => 2, 'name' => 'John doe', 'username' => 'johnny', 'email' => 'johndoe@gmail.com', 'password' => bcrypt('carrotz1243')],
        ];

        User::create($users);
    }

}

【问题讨论】:

    标签: php laravel schema eloquent seed


    【解决方案1】:

    如果你必须使用模型,你需要一个循环:

    foreach($users as $user){
        User::create($user);
    }
    

    否则你可以只使用DB::table()insert

    DB::table('users')->insert($users);
    

    其实你也可以在模型上调用insert()(结果查询是一样的)

    User::insert($users);
    

    注意如果您选择 insert 方法,您将失去特殊的 Eloquent 功能,例如时间戳和模型事件。

    【讨论】:

    • 最近有变化吗?我有一个模糊的记忆,能够完全按照 OP 尝试的方式去做,不久前。
    • @JoelHinz 不是。据我所知,这是不可能的。它has been discussed 但请求被拒绝了。
    • 谢谢它工作正常,可惜我不能在官方文档中回溯这样的事情。
    • 很公平。那一定是我的记忆。 :)
    • @lukasgeiter 你的答案中带有 foreach 的代码的第一部分非常糟糕。 ->create() 方法将在现场触发插入命令。更好的方法是使用 ->make() 方法并生成数据,然后在生成后只使用一个查询插入。
    【解决方案2】:

    这适用于 Laravel ^5

    <?php
    
    use Illuminate\Database\Seeder;
    
    class UsersTableSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
    
        public function run()
        {
            // check if table users is empty
            if(DB::table('users')->count() == 0){
    
                DB::table('users')->insert([
    
                    [
                        'name' => 'Administrator',
                        'email' => 'admin@app.com',
                        'password' => bcrypt('password'),
                        'created_at' => date('Y-m-d H:i:s'),
                        'updated_at' => date('Y-m-d H:i:s'),
                    ],
                    [
                        'name' => 'Agency',
                        'email' => 'agency@app.com',
                        'password' => bcrypt('password'),
                        'created_at' => date('Y-m-d H:i:s'),
                        'updated_at' => date('Y-m-d H:i:s'),
                    ],
                    [
                        'name' => 'End',
                        'email' => 'endcustomer@app.com',
                        'password' => bcrypt('password'),
                        'created_at' => date('Y-m-d H:i:s'),
                        'updated_at' => date('Y-m-d H:i:s'),
                    ]
    
                ]);
                
            } else { echo "\e[31mTable is not empty, therefore NOT "; }
    
        }
    }
    

    【讨论】:

    • 这个命令以某种方式只插入第一行并且没有错误
    • @gray_15 不适合我!
    • 如果我或其他人将来遇到同样的错误,请务必指定每个插入的列名(我没有,所以它给了我一个错误)。
    • @gray_15 我有同样的事情。但是,如果我将用户数组从插入中移出并执行 insert($users) 它工作正常。
    • 直接传递数组或先将其放入变量之间应该没有区别。但是如果你直接做,不要忘记添加实际的数组括号。 IE。 [a => 1, b=>2], [a=>3, b=>4] 不起作用。确保执行 [[a => 1, b=>2], [a =>3, b =>4]] 以便传入记录数组。否则,您将传递除第一个以外的所有参数作为要插入的参数。
    【解决方案3】:
    public function run()
    {
        //
        for ($i=0; $i < 1000; $i++) { 
             DB::table('seo_contents')->insert([
                'title' => str_random(10),
                'content' => str_random(100),
                'created_at'=>date('Y-m-d H:i:s'),
                'updated_at'=>date('Y-m-d H:i:s'),
    
            ]);
        }
    
    }
    

    【讨论】:

    • 永远不要在播种机上使用 foreach 或 for 循环。如果您有大量数据,则会对性能产生巨大影响。对于每个插入,都有一个查询,而不是在 1 个查询中进行插入
    • 您能否详细说明虚拟数据生成过程的影响,尤其是 foreach 或 for 循环?你有其他选择吗?
    • 这只是访问数据库的查询数量......使用上面的代码,您将使用 1000 个插入查询访问数据库......更好的方法是首先创建数据(在RAM)使用foreach,然后使用一个查询来存储数据,例如DB::table('seo_contents')-&gt;insert($data);,其中$data是生成的行数组
    【解决方案4】:

    create() 仅用于存储一条记录。要存储多条记录,您应该使用insert() 而不是create()。 所以代码将如下所示:

    class UserTableSeeder extends Seeder {
    
      public function run()
      {
        DB::table('users')->delete();
    
        $users = [
            ['id' => 1, 'name' => 'Stephan de Vries', 'username' => 'stephan', 'email' => 'stephan-v@gmail.com', 'password' => bcrypt('carrotz124')],
            ['id' => 2, 'name' => 'John doe', 'username' => 'johnny', 'email' => 'johndoe@gmail.com', 'password' => bcrypt('carrotz1243')],
        ];
    
        User::insert($users);
      }
    
    }
    

    附: insert() 函数不会存储时间戳。即created_by & updated_by 字段。

    【讨论】:

      【解决方案5】:

      如果有人为此苦苦挣扎,我自 Laravel 5 以来一直在使用以下内容,并且可以确认仍在 Laravel 7+ 中工作...

      class UserTableSeeder extends Seeder {
      
      public function run()
      {
          \DB::table('users')->delete();
      
          \DB::table('users')->insert(array (
              0 => 
                array (
                       'id' => 1,
                       'name' => 'Stephan de Vries',
                       'username' => 'stephan',
                       'email' => 'stephan-v@gmail.com',
                       'password' => bcrypt('carrotz124'
               ),
              1 => 
                array (
                       'id' => 2,
                       'name' => 'John doe',
                       'username' => 'johnny',
                       'email' => 'johndoe@gmail.com',
                       'password' => bcrypt('carrotz1243'
               ),
           ));
      
      }}
      

      【讨论】:

        【解决方案6】:

        使用截断

        <?php
        
        use Illuminate\Database\Seeder;
        use App\User;
        
        class UsersTableSeeder extends Seeder
        {
             /**
             * Run the database seeds.
             *
             * @return void
             */
        
          public function run()
            {
        
              User::truncate();
        
                $users =  [
                    [
                      'name' => 'Super Admin',
                      'email' => 'superadmin@gmail.com',
                      'password' => '123456',
                    ],
                    [
                      'name' => 'Account Admin',
                      'email' => 'accountadmin@gmail.com',
                      'password' => '13456',
                    ],
                    [
                      'name' => 'Project Admin',
                      'email' => 'projectadmin@gmail.com',
                      'password' => '13456',
                    ],
                    [
                      'name' => 'Client Admin',
                      'email' => 'clientadmin@gmail.com',
                      'password' => '13456',
                    ]
                  ];
        
                  User::create($users);
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-04-13
          • 1970-01-01
          • 2019-11-17
          • 2020-11-05
          • 2019-01-05
          • 1970-01-01
          • 2014-05-04
          • 2017-12-29
          相关资源
          最近更新 更多