【问题标题】:How to generate unique Voucher code in laravel 5.2?如何在 laravel 5.2 中生成唯一的 Voucher 代码?
【发布时间】:2017-05-08 21:41:39
【问题描述】:

我想保存唯一的优惠券代码以及字符和数字的组合,它的长度应该是 6。我正在使用 Laravel 框架 5.2

enter code here
$data = $request->all();
        unset($data['_token']);
        //echo "<pre>"; print_r($data); die;
        for ($i=1; $i <=$data['countvoucher']; $i++) { 
            $voucher = new Voucher;
            $voucher->code = "123456";// it should be dynamic and unique
            $voucher->percentage = $data['percentage'];
            $voucher->usage  = $data['usage'];
            $voucher->expirydate = $data['expirydate'];
            $voucher->save();
        }

$voucher->code 我想保存在这个文件中,谁能帮帮我

【问题讨论】:

标签: php laravel-5.2


【解决方案1】:

我正在使用这个功能 你可以像下面这样使用它

 $voucher->code = $this->generateRandomString(6);// it should be dynamic and unique 

public  function generateRandomString($length = 20) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }

【讨论】:

  • 谢谢它的工作,但你有一个错误 $voucher->code = $voucher->generateRandomString(6);替换为 $voucher->code = $this->generateRandomString(6);
  • 我喜欢这个选项,因为您可以排除“有问题”的字符,例如:l、1、i,这些字符可能会让人混淆。
  • 即使是随机字符串,也需要在db中检查是否生成过代码,避免出现意外行为。
  • 对不起,这里保证唯一性的东西是什么
  • 这个函数不太可能创建一个(不是唯一的)代码,尤其是当 $length 很大的时候,但是随着越来越多的代码生成,它变得很危险,所以不能保证
【解决方案2】:
  private static function generateNumber()
    {
        $number = Str::random(9);
        if (self::where('number', $number)->count() > 0) self::generateNumber();
        return $number;
    }

【讨论】:

    【解决方案3】:

    您可以使用 Laravel 的内置帮助方法 str_random 生成更真正“随机”的字母数字字符串:

    str_random(6)
    

    str_random 函数生成指定长度的随机字符串。这个函数使用了PHP的random_bytes函数。

    所以你的最终代码将是:

    $voucher->code = str_random(6);
    

    【讨论】:

    • 我认为如果我生成另一个它不会提供唯一性
    • tinker 上试用它总是会生成一个唯一的代码。我已经测试过了。
    • 修补??意思是
    • 在你的命令行中写php artisan tinker,然后在每一行写str_random(6)
    • 在此处了解更多信息scotch.io/tutorials/…
    【解决方案4】:

    这是代码

    $chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $code = "";
    for ($i = 0; $i < 6; $i++) {
        $code .= $chars[mt_rand(0, strlen($chars)-1)];
    }
    

    将代码中的这一行替换为

    $voucher->code = $code;// it should be dynamic and unique
    

    我希望这会奏效

    编辑

    你也可以尝试其他方法

    $code = strtoupper(uniqid()); // if you dont have any restriction on length of code
    

    对于长度限制试试这个

    function generateCouponCode($length = 6) {
      $chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      $ret = '';
      for($i = 0; $i < $length; ++$i) {
        $random = str_shuffle($chars);
        $ret .= $random[0];
      }
      return $ret;
    }
    

    【讨论】:

    • 在 helper 中添加这个函数并在整个项目中使用任何你想要的地方
    【解决方案5】:
    use Illuminate\Support\Str;
    $random = Str::random(6);
    "emPK39"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2017-06-17
      • 2017-06-28
      • 2010-09-18
      • 2014-07-20
      • 2019-01-23
      • 2023-03-22
      • 2011-08-19
      相关资源
      最近更新 更多