No meu codigo legado feito em php puro, ao inserir o poduto na tabela bt_produtos, tem uma função "gerarcod" que gera um codigo aleatorio unico para coluna "pr_cod_produto"
gerarcod("bt_produtos","pr_cod_produto", 15);
function gerarcod($tabela, $unico, $norma){
$pdo = conectar();
$grave = "sim";
while($grave = "sim"){
$dtbase=date('Y');
$letras = array('A','T','U','I','H','P','W','R','T');
$numeros = array(0,1,2,3,4,5,6,7,8,9);
$total_let = count($letras)-1;
$total_num = count($numeros)-1;
$codigo = $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)] . $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)] . $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)];
$codigo = $dtbase.$codigo;
$validar = $pdo ->prepare("SELECT * FROM $tabela WHERE cod_plan=?");
$validar -> execute(array($codigo));
if($validar->rowCount() == 0):
$codigo = "sucesso/$codigo";
break;
else:
continue;
endif;
}
list($retorno, $primaria) = explode("/",$codigo);
if($retorno!="sucesso"){ $primaria = "falha"; }
return $primaria;
}
<?php
namespace App\Models\Office;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class CodeReference extends Model
{
use HasFactory;
protected $table = 'code_reference';
protected $guarded = [];
public $timestamps = false;
/**
* Retorna um novo código único para ser usado em N situações
*
* @return string
*/
public static function newCode($prefix = ''): string
{
$lethers = [
['A','K','U'],
['B','L','V'],
['C','M','W'],
['D','N','X'],
['E','O','Y'],
['F','P','Z'],
['G','Q'],
['H','R'],
['I','S'],
['J','T'],
];
$reference = self::create([]);
$reference = strval($reference->id);
$code = '';
for($i = 0; $i < strlen($reference); $i++) {
$code .= $lethers[intval($reference[$i])][array_rand($lethers[intval($reference[$i])])];
}
return $prefix.$code;
}
}
public static function new(array $data, BonusStatus $typeStatus, BonusType $type, BonusLaunchType $launchType): Bonus
{
$code = CodeReference::newCode('BNF');
return self::create([
'cod_detalhe' => $code,
'cod_conta' => $data['account'],
]);
}
}