首页 文章

使用雄辩的ORM在Laravel中批量插入

提问于
浏览
102

我们如何使用Eloquent ORM在Laravel中执行批量数据库插入?

我想在Laravel中完成这个:https://stackoverflow.com/a/10615821/600516但是我收到以下错误 .

SQLSTATE [HY093]:参数号无效:混合命名和位置参数 .

8 回答

  • 2

    我多次搜索它,最后使用自定义 timestamps 如下:

    $now = Carbon::now()->toDateTimeString();
    Model::insert([
        ['name'=>'Foo', 'created_at'=>$now, 'updated_at'=>$now],
        ['name'=>'Bar', 'created_at'=>$now, 'updated_at'=>$now],
        ['name'=>'Baz', 'created_at'=>$now, 'updated_at'=>$now],
        ..................................
    ]);
    
  • 20

    你可以使用 Eloquent::insert() .

    例如:

    $data = array(
        array('name'=>'Coder 1', 'rep'=>'4096'),
        array('name'=>'Coder 2', 'rep'=>'2048'),
        //...
    );
    
    Coder::insert($data);
    
  • -1

    我们可以更新GTF答案以轻松更新时间戳

    $data = array(
        array(
            'name'=>'Coder 1', 'rep'=>'4096',
            'created_at'=>date('Y-m-d H:i:s'),
            'modified_at'=> date('Y-m-d H:i:s')
           ),
        array(
             'name'=>'Coder 2', 'rep'=>'2048',
             'created_at'=>date('Y-m-d H:i:s'),
             'modified_at'=> date('Y-m-d H:i:s')
           ),
        //...
    );
    
    Coder::insert($data);
    

    更新:为了简化我们可以使用碳的日期,@ Pedro Moreira建议

    $now = Carbon::now('utc')->toDateTimeString();
    $data = array(
        array(
            'name'=>'Coder 1', 'rep'=>'4096',
            'created_at'=> $now,
            'modified_at'=> $now
           ),
        array(
             'name'=>'Coder 2', 'rep'=>'2048',
             'created_at'=> $now,
             'modified_at'=> $now
           ),
        //...
    );
    
    Coder::insert($data);
    

    UPDATE2:对于laravel 5,使用 updated_at 而不是 modified_at

    $now = Carbon::now('utc')->toDateTimeString();
    $data = array(
        array(
            'name'=>'Coder 1', 'rep'=>'4096',
            'created_at'=> $now,
            'updated_at'=> $now
           ),
        array(
             'name'=>'Coder 2', 'rep'=>'2048',
             'created_at'=> $now,
             'updated_at'=> $now
           ),
        //...
    );
    
    Coder::insert($data);
    
  • 56

    对于正在阅读本文的人,请查看createMany() method .

    /**
     * Create a Collection of new instances of the related model.
     *
     * @param  array  $records
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function createMany(array $records)
    {
        $instances = $this->related->newCollection();
    
        foreach ($records as $record) {
            $instances->push($this->create($record));
        }
    
        return $instances;
    }
    
  • 11

    这是你如何以更有说服力的方式做到这一点,

    $allintests = [];
        foreach($intersts as $item){ //$intersts array contains input data
            $intestcat = new User_Category();
            $intestcat->memberid = $item->memberid;
            $intestcat->catid= $item->catid;
            $allintests[] = $intestcat->attributesToArray();
        }
        User_Category::insert($allintests);
    
  • -2
    $start_date = date('Y-m-d h:m:s');        
            $end_date = date('Y-m-d h:m:s', strtotime($start_date . "+".$userSubscription['duration']." months") );
            $user_subscription_array = array(
              array(
                'user_id' => $request->input('user_id'),
                'user_subscription_plan_id' => $request->input('subscription_plan_id'),
                'name' => $userSubscription['name'],
                'description' => $userSubscription['description'],
                'duration' => $userSubscription['duration'],
                'start_datetime' => $start_date,
                'end_datetime' => $end_date,
                'amount' => $userSubscription['amount'],
                'invoice_id' => '',
                'transection_datetime' => '',
                'created_by' => '1',
                'status_id' => '1', ),
    array(
                'user_id' => $request->input('user_id'),
                'user_subscription_plan_id' => $request->input('subscription_plan_id'),
                'name' => $userSubscription['name'],
                'description' => $userSubscription['description'],
                'duration' => $userSubscription['duration'],
                'start_datetime' => $start_date,
                'end_datetime' => $end_date,
                'amount' => $userSubscription['amount'],
                'invoice_id' => '',
                'transection_datetime' => '',
                'created_by' => '1',
                'status_id' => '1', )
            );
            dd(UserSubscription::insert($user_subscription_array));
    

    UserSubscription 是我的型号名称 . 如果成功插入,则返回"true",否则为"false" .

  • 213

    或者在使用Laravel工厂(创建10个用户)时:

    $users = factory(App\User::class, 10)->make()->toArray();
    
    App\User::insert($users);
    
  • -1

    也许更多Laravel解决这个问题的方法是使用集合并使用模型利用时间戳循环插入 .

    <?php
    
    use App\Continent;
    use Illuminate\Database\Seeder;
    
    class InitialSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            collect([
                ['name' => 'América'],
                ['name' => 'África'],
                ['name' => 'Europa'],
                ['name' => 'Asia'],
                ['name' => 'Oceanía'],
            ])->each(function ($item, $key) {
                Continent::forceCreate($item);
            });
        }
    }
    

    编辑:

    对不起我的误会 . 对于批量插入,这可能有所帮助,也许有了这个,你可以制作好的播种机并优化它们 .

    <?php
    
    use App\Continent;
    use Carbon\Carbon;
    use Illuminate\Database\Seeder;
    
    class InitialSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            $timestamp = Carbon::now();
            $password = bcrypt('secret');
    
            $continents = [
                [
                    'name' => 'América'
                    'password' => $password,
                    'created_at' => $timestamp,
                    'updated_at' => $timestamp,
                ],
                [
                    'name' => 'África'
                    'password' => $password,
                    'created_at' => $timestamp,
                    'updated_at' => $timestamp,
                ],
                [
                    'name' => 'Europa'
                    'password' => $password,
                    'created_at' => $timestamp,
                    'updated_at' => $timestamp,
                ],
                [
                    'name' => 'Asia'
                    'password' => $password,
                    'created_at' => $timestamp,
                    'updated_at' => $timestamp,
                ],
                [
                    'name' => 'Oceanía'
                    'password' => $password,
                    'created_at' => $timestamp,
                    'updated_at' => $timestamp,
                ],
            ];
    
            Continent::insert($continents);
        }
    }
    

相关问题