主キー(プライマリキー)は普通は次を使います。
- カラムはunsigned bigint型
- オートインクリメント
この主キーを文字列にしたい場面がありました。
Laravel Eloquentでの変更方法をまとめます。
具体的なテーブル名とコードを出すなら次の通りです。
このページの目次
ここで作りたい文字列が主キーなテーブル構造
ここでは次のテーブルを作りたいとします。
▼ 例えば名前をproductsテーブルとする
カラム名 | データ型 | 補足 |
id | varchar(30) | 主キー |
name | varchar(100) |
この場合はidカラムの値が絶対に重複しないという前提でのテーブル設計にしたいと思います。(例えば数字以外を含むIDだったりとか)
もちろんオートインクリメントするbigint型のidカラムを作り、別途uniqueなカラムを作る手もあるけど、ちょっと無駄が多い気がします
まずはmigrationから主キーを指定してテーブル作成
ではLaravelで具体的に作っていきます。
▼ まずartisanからmigrationを作成
1 |
php artisan make:migration create_products_table |
▼ こういう内容でmigrateしてみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class CreateProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('products', function (Blueprint $table) { //$table->id(); $table->string('id', 30)->primary(); $table->string('name', 100); $table->timestamps(); }); } /// down()は省略... } |
こういう感じですね。
上記コードでは $table->id(); をコメントアウトして、代わりに $table->string('id', 30)->primary(); とすることでプライマリキーを設定しています。
ちなみに文字列の長さについては長くしすぎないことを推奨します。最後あたりにも書くのですが、MySQLのとある成約に引っかかる可能性もあるためです。
そして php artisan migrate を実行。
ひとまずテーブルができあがりました。
Modelクラスにて主キーを変更するコード追加
これだけでは不十分です。
お次はModelクラスで主キーを変えたことを明示します。
▼ 先ほどのテーブル用のModelを作成
1 |
php artisan make:model Product |
▼ このように主キー変更を明示しておく
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Product extends Model { use HasFactory; protected $table = 'hoge'; protected $fillable = [ 'id', 'name' ]; /// 主キーカラム名を指定 protected $primaryKey = 'id'; /// オートインクリメント無効化 public $incrementing = false; /// Laravel 6.0+以降なら指定 protected $keyType = 'string'; } |
Modelクラスでは $primaryKey でプライマリキー名を管理してるみたいです。あと文字列だから $incrementing = false; としてオートインクリメント無効化してます。
あとLaravel6.9以降なら $keyType で主キーの型がなんなのかも指定しておくべき。あとは特に言うべきことはありません。
主キーは一意になるなら文字列でもなんでもOK
これはLravelというよりSQLの話ですが・・・
プライマリキーには次のようなルールがあります。
- 主キーはINTEGERである必要はない
- オートインクリメントする必要もない
- 一意になるなら文字列でも何でもOK
Laravelでも上記の方法で主キーを文字列に設定できます。
ただし文字列の主キーでは長さ上限に注意が必要!
ただ文字列を主キーにするなら長さには要注意です。
実はユニークキーには次の制約があります。
- ユニークキーが文字列として定義されてる場合
- そしてvarcharなどの可変長型を使ってる場合
- その長さは767バイトまでに制限されてしまう
MySQLにはこういうルールがあるみたいです。
詳しくは次記事でも解説したのでご覧ください。
主キーが varchar(100) 程度なら問題ありません。
でも長めの文字列を主キーに使うなら気を付けるべきです。
以上、Laravelで主キーを文字列にする方法でした。
ではまた バイバイ(@^^)/~~~