【问题标题】:Best way to bulk create models within Laravel?在 Laravel 中批量创建模型的最佳方法?
【发布时间】:2021-10-20 09:34:43
【问题描述】:

我正在创建一项功能,其中涉及为折扣创建优惠券代码。我包含一个输入,用户可以填写他们想要的具体金额。

当它点击 store 方法时,如果用户输入了 15 个凭证,你将如何一次创建那么多模型记录?

通过查看 laravel 文档,我唯一看到的是使用工厂,所以我在下面尝试了这个。

public function storeCodes(Request $request, VoucherGroup $voucherGroup)
{
    VoucherCode::create([
        'code' => $this->generateUniqueCode(),
        'group_id' => $voucherGroup->id,
        'used' => 0
    ]);

    session()->flash('success', 'successfully created codes.');

    return back();
}

 private function generateUniqueCode()
    {
        $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersNumber = strlen($characters);
        $code = '';

        while (strlen($code) < 6) {
            $position = rand(0, $charactersNumber - 1);
            $character = $characters[$position];
            $code = $code . $character;
        }

        if (VoucherCode::where('code', $code)->exists()) {
            dd('lol');
            $this->generateUniqueCode();
        }

        return $code;
    }

输入

<x-inputs.input size="6" type="number" name="voucher_amount" required>How many Voucher codes do you want
                to
                generate?
            </x-inputs.input>

问题是它创建了模型,但代码为每个模型返回相同的代码。

如何在一次调用中创建 15 个具有唯一代码字段的模型?

【问题讨论】:

  • 您可以制作一组项目并使用Model::insert(),但如果适用,您需要制作自己的时间戳。
  • 将你的 create 函数放入 for 循环中。
  • @Lowtiercoder 可以分享一下方法吗generateUniqueCode();
  • Maik Lowrey 我已经添加了完整的代码,因此 html 输入是需要创建的记录数量,并且每个记录的代码都必须是唯一的。我尝试了以下答案,但它卡住了循环创建而不是根据输入退出
  • @reans 但是如果我从输入中传递一个数字,您可以通过查看您需要自己手动添加的示例来指定要创建多少条记录吗?

标签: laravel eloquent


【解决方案1】:

下面的 for 循环为我解决了这个问题。它最初是由某人发布的,但最近已被删除,因此无法回答以下问题,但感谢提供它的人!

$newVouchers = [];
        for ($i = 0; $i < $request->voucher_amount; $i++) {
            $newVouchers[] = VoucherCode::create([
                'code' => $this->generateUniqueCode(),
                'group_id' => $voucherGroup->id,
                'used' => 0
            ]);
    }

【讨论】:

    【解决方案2】:

    你可以试试看

    do {
        //generate unique code
        $uniqueCode = strtoupper(substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, 15));
    } while (VoucherCode::where('code', $uniqueCode)->exists());
    
    VoucherCode::create([
        'code' => $uniqueCode,
        'group_id' => $voucherGroup->id,
        'used' => 0
    ]);
    
    session()->flash('success', 'successfully created codes.');
    
    return back();
    

    【讨论】:

      【解决方案3】:

      您可以使用Insert Statements 批量创建模型

      $vouchers = []; 对于 ($i = 0; $i $this->generateUniqueCode(), 'group_id' => $voucherGroup->id, '使用' => 0 ]; } DB::table('users')->insert($vouchers);

      【讨论】:

        猜你喜欢
        • 2016-05-19
        • 1970-01-01
        • 2021-10-01
        • 2015-10-15
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 2019-09-05
        相关资源
        最近更新 更多