PHPでプログレッシブシーケンシャルユニークIDを生成するにはどうすればよいですか?
たとえば、順序は次のようになります。
aaaaaa < aaaaab < aaaaac など...
PHPでプログレッシブシーケンシャルユニークIDを生成するにはどうすればよいですか?
たとえば、順序は次のようになります。
aaaaaa < aaaaab < aaaaac など...
uniqid()
増加しています (後で生成された ID は、以前に生成された ID よりも常に大きくなります) が、連続的ではありません (ギャップが生じます)。
それ以外の場合は、最後に生成された ID を保存し、新しい ID を生成するときにそれをインクリメントする方法を見つけてください。
これはデフォルトで、PHPで文字列を直接操作できます。http://php.net/manual/en/language.operators.increment.phpIncrementing/Decrementing Operators
を参照してください。
$start = "aaaaaa" ;
$start++;
$start++;
var_dump($start);
出力
string 'aaaaac' (length=6)
$id = 'aaaax';
for ($i=0; $i<100; $i++) {
$id++;
echo "$id\n";
}
ここで他のソリューションを使用する場合でも、最後の ID を取得または保存してから、それをインクリメントする必要があります。代わりに、単純に自動インクリメントされた ID を使用して、それをテキスト表現に変換することができます。
ここでは Laravel の例を使用していますが、理論はどのフレームワークにも適用できます。
// Save your model.
$flight = new Flight;
$flight->name = $request->name;
$flight->save();
// $flight->id now contains the last inserted id.
echo base_convert($flight->id, 10, 36);
// Output: 1E86
10 進数は 0 ~ 9 の数字です。Base 36 はそれにアルファベットの 26 文字を追加します。
実際に出力をデータベースに保存する必要はないことに注意してください。これにより、別のクエリが必要になり、この最適化の目的が無効になります。代わりに、ID をリアルタイムで変換するミューテーターを追加できます。
class Flight extends Model {
...
public function getUniqueIdAttribute()
{
return base_convert($this->id, 10, 36);
}
}
これで、モデルを保存して呼び出し$flight->uniqueId
て、base 36 に変換された ID を取得するだけです。
ヒント: 実際のデータベース ID が漏洩しないように、id にソルト値を追加します。