2017-02-08 3 views
2

Ich versuche, eine Inkrementnummer Lizenz mit dem aktuellen Datum des Jahres + eine Inkrementnummer zu erstellen, aber ich weiß wirklich nicht, wie das zu tun, ich weiß, MYSQl unterstützt keine Sequenzen aber ich würde gerne wissen, ob es einen Weg gibt, das ProblemSequenz ID Inkrement mit Datum - Laravel

hier mein Controller

public function create(){ 
$licence = new Licence ; 
$licence ->num_licence = Carbon::now()->year -- i would like here to put the current year like 2017 with a random unique number to get the format like 20170001 for exemple ! 

... 

, wie man acheice dieses Problem zu lösen? Vielen Dank im Voraus :)

+0

Muss die Nummer jedes Jahr neu eingestellt werden? –

+0

ja :) es muss jedes Jahr zurückgesetzt werden –

Antwort

2

Sie uniqid Funktion mit aktuellem Jahr als Präfix verwenden können.

public function create(){ 
    $licence = new Licence ; 
    $num_liscence_exist=true; 
    while($num_liscence_exist){ 
     $num_liscence=uniqid(Carbon::now()->year); 
     if (!Liscence_Table::where('num_liscence', '=',"'".$num_liscence."'")->exists()) { 
     $liscence->num_liscence=$num_liscence; 
     $num_liscence_exist=false; 
     } 
    } 
} 
+0

danke für deine Hilfe! In meinem Feld num_licence in der Datenbank setze ich den Typ Wert als eine eindeutige ID oder ein String-Typ? –

+0

Sie müssen eine while-Schleife hinzufügen und prüfen, ob der generierte Schlüssel bereits in Ihrer Tabelle existiert .... wenn Sie uniqid verwenden, muss num_liscence den Typ varchar haben --siehe update –

+0

danke für Ihre Antwort, damit werde ich nie haben gleiche Zahlen Konflikte richtig? –

1

Generieren den Zufall id uniqid() und verketten mit Datum mit:

public function create(){ 
    $liscence=new Liscence(); 
    $year = Carbon::now()->year; 
    $liscence->num_liscence= $year. uniqid(); 
    $liscence->save(); 
} 
+0

genial ich werde jetzt testen !!! Danke für die Hilfe !!! in meiner Datenbank für die colomun "num_licence" ich es als eine eindeutige ID oder String-Typ? –

+0

'uniqid()' generiert eine Sequenz, aber es ist erwähnenswert, dass es Lücken hat. Das kann gut sein oder nicht, abhängig von den tatsächlichen Bedürfnissen. (Viele meiner Kunden sind wirklich genervt von Lücken, es muss eine psychologische Erklärung geben.) –

+0

Diese Nummer wird von Kunden gesucht werden, also werde ich es indexieren! übrigens habe ich nachgeprüft und ich habe diese random number: 2017589adc05eeb9b könnte ich es vielleicht als etwas wie 2017 mit präfix L und 4 zahlen? –

1

mit uniqid() eindeutige Nummer erhalten oder auch können Sie Zeitstempel mit ihm verwenden:

$liscence=new Liscence(); 
$year = Carbon::now()->year; 
$liscence->num_liscence= $year. strtoupper(uniqid()) . Carbon::now()->timestamp; 
$liscence->save(); 

wird wie folgt aussehen: 2017ABC011486543961

+0

das ist wirklich cool! also wird meine Nummer wirklich einzigartig sein, irgendwelche Konflikte oder doppelte Werte werden passieren, oder? –

+0

Es gibt keine Chance zu Konflikten, weil die Zeit einzigartig ist ... –

+0

perfekt! Könnte ich die Anzahl der Charaktere anpassen? um etwas wie 2017L mit 5 Nummern zu bekommen –

0

Eine Sequenz irgendwo so gespeichert werden muss, bezweifle ich, es gibt eine vernünftige pure-PHP Lösung. Aber da Sie MySQL bereits verwenden, gibt es keinen Grund, es nicht zu verwenden. Ich würde eine Datenbanktabelle für das Erstellen, so etwas wie:

CREATE TABLE licence_sequence (
    sequence_year YEAR NOT NULL, 
    next_value INT UNSIGNED NOT NULL DEFAULT 1, 
    PRIMARY KEY (sequence_year, next_value) 
) 
ENGINE=InnoDB; 

(Hässliche sequence_year Namens zu vermeiden wurde gewählt, die es jedes Mal zu zitieren.)

Sie dann diese von Code zu verwalten haben einschließlich:

  • Gewährleistung Sie haben Zeilen für jedes Jahr, wie Sie sie benötigen (dies kann so einfach sein wie Daten für alle Jahre für das nächste Jahrhundert bevölkern).

  • Stellen Sie sicher, dass Sie verschiedenen Artikeln nicht denselben Wert zuweisen.

Eine grobe Übersicht über Sachen zu beachten:

  • Sie können (und sollten) Ihre Lizenznummer einen eindeutigen Index Betrogenen zu vermeiden machen.
  • Sie können Transaktionen verwenden, um unnötige Lücken zu vermeiden. Transaktion sollte wickelt alle Operationen beteiligt: ​​

    1. Erhalten nächste Sequenznummer
    2. Speicher in neue Lizenz
    3. Increment nächste Nummer
  • Sie müssen atomare Operationen in einem Multi-Tasking, um sicherzustellen, Umgebung. Das ist der schwierigste Teil. Ich habe in letzter Zeit mit MySQL named locks gespielt und sie scheinen richtig zu funktionieren.