web-dev-qa-db-fra.com

Laravel - générer un numéro de commande unique

J'essaie actuellement de générer un numéro de commande unique lorsque l'utilisateur atteint la méthode create. Les numéros de commande sont générés comme ceci dans la graine et doivent également ressembler à ceci

Seed

foreach(range(1,25) as $index)
    {
        DB::table('orders')->insert([

            'user_id' => Rand(1,25),
            'order_nr' => '#' . sprintf("%08d", $index),
            'price_sum' => $faker->randomNumber($nbDigits = 4, $strict = false) . '.' . $faker->randomNumber($nbDigits = 2, $strict = false),
            'status' => $faker->randomElement(['paid', 'pending', 'failed']),
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now(),

        ]);
    }

Les numéros de commande ressemblent à ceci #00000001 ou #00000002. Maintenant, lorsque l'utilisateur atteint la méthode de création dans mon contrôleur, un nouveau numéro de commande unique dans cette séquence doit être créé. Comment puis-je y arriver? Le contrôleur ressemble actuellement à ceci:

 public function create()
{
    $order = new Order;

    $order->user_id = Auth()->id();
    $order->order_nr = 


    dd($order);


    return view('steps.order');
}

Il doit vérifier le dernier numéro de commande et en créer un avec +1 pour ce numéro de commande. Disons par exemple qu'il y a 25 commandes et que la dernière est # 00000025, celle qui doit être créée ensuite doit être # 00000026. Comment puis-je y arriver?

4
Rainier Laan

Essayez de faire comme suit

$order = new Order;

$order->user_id = Auth()->id();
$latestOrder = App\Order::orderBy('created_at','DESC')->first();
$order->order_nr = '#'.str_pad($latestOrder->id + 1, 8, "0", STR_PAD_LEFT);
$order->save();

Ici, je suppose que l'identifiant est auto-incrémenté. Voir la méthode str_pad pour plus de détails

5
KalyanLahkar

Utilisez la valeur d'identifiant de colonne automatique de vos lignes pour générer le numéro de commande. Cependant, ne créez pas de colonne supplémentaire pour votre numéro de commande, car cela vous donnerait une base de données non normalisée, car la colonne de commande est complètement dépendante de la colonne id.

Au lieu de cela, ajoutez cette méthode à votre modèle order

public function get_order_number()
{
    return '#' . str_pad($this->id, 8, "0", STR_PAD_LEFT);
}

Si votre dernière commande avait l'identifiant 5 et que vous la supprimiez, la commande suivante porterait l'identifiant 6.

La seule exception possible est si vous créez des commandes dans une transaction. Si une transaction est annulée, l'ID de commande associé serait ignoré. 

0
Adam

J'ai trouvé une meilleure solution:

$paynowbillprefix1="ADDON-";
$paynowbillprefix1=strlen($paynowbillprefix1);
$query2 = "select gen_id from user_cart_addon order by id desc limit 0, 1";
$exec2 = mysqli_query($conn,$query2) or die ("Error in Query2".mysqli_error());
$res2 = mysqli_fetch_array($exec2);
$num2 = mysqli_num_rows($exec2);
$billnumber = $res2["gen_id"];
$billdigit=strlen($billnumber);
if ($billnumber == '')
{
    $billnumbercode ='ADDON-'.'1';
}
else
{
    $billnumber = $res2["gen_id"];
    $billnumbercode = substr($billnumber,$paynowbillprefix1, $billdigit);
    $billnumbercode = intval($billnumbercode);
    $billnumbercode = $billnumbercode + 1;
    $maxanum = $billnumbercode;   
    $billnumbercode = 'ADDON-'.$maxanum;
}
0
Rajakishore B

Vous pouvez essayer avec ceci:

public function generateOrderNR()
{
    $orderObj = \DB::table('orders')->select('order_nr')->latest('id')->first();
    if ($orderObj) {
        $orderNr = $orderObj->order_nr;
        $removed1char = substr($orderNr, 1);
        $generateOrder_nr = $stpad = '#' . str_pad($removed1char + 1, 8, "0", STR_PAD_LEFT);
    } else {
        $generateOrder_nr = '#' . str_pad(1, 8, "0", STR_PAD_LEFT);
    }
    return $generateOrder_nr;
}

Vous pouvez générer order_nr en utilisant ceci: $this->generateOrderNR(); dans votre fonction create().

De plus, mt_Rand() est 4 fois plus rapide que Rand(), vous pouvez l'utiliser pour améliorer l'expérience utilisateur.

0
Nazmus Shakib