日本語テーブル名・カラム名のデータベースをLaravelで扱う
SQL Server+AccessのシステムをPHP+MySQLにリプレースする仕事を受けてデータベースを調査していたのですが、テーブル名もカラム名の日本語のデータベースで、苦労するかなと思いましたが、小さな動くサンプルを作って検証したところすんなり動きました。そのサンプルのメモです。
テーブルの作成
以下のようなテーブル「顧客」を作成します。
顧客 |
---|
顧客コード |
名前 |
住所 |
電話番号 |
まずマイグレーションファイルを作ります。
php artisan make:migration create_顧客_table --create=顧客
database/migrations/xxxx_create_顧客_table.php
が出来るので、up
メソッドにカラムを追記します。
public function up()
{
Schema::create('顧客', function (Blueprint $table) {
$table->increments('顧客コード');
$table->string('名前');
$table->string('住所');
$table->string('電話番号');
$table->timestamps();
});
}
マイグレーションを実行します。
php artisan migrate
モデルの作成
php artisan make:model 顧客
app/顧客.php
ができるので、以下を追記します。
class 顧客 extends Model
{
protected $table = '顧客';
protected $primaryKey = '顧客コード';
protected $guarded = ['顧客コード'];
}
デフォルトの命名規則で作るとテーブル名が「顧客s」になり不自然なので、$table
でテーブル名を指定します。プライマリキーのデフォルトもid
から日本語に変更します。
ルートの作成
routes/web.php
を書きます。
<?php
use App\顧客;
Route::get('/', function () {
return view('index', ['顧客達' => 顧客::all()]);
});
Route::post('/', function () {
顧客::create(request()->toArray());
return redirect('/');
});
一覧と新規追加のみです。
ビューの作成
resources/views/index.blade.php
を書きます。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>顧客管理</title>
</head>
<body>
<form method="post">
{{ csrf_field() }}
名前<input name="名前"><br>
住所<input name="住所"><br>
電話番号<input name="電話番号"><br>
<button>登録</button>
</form>
<table>
<tr><th>顧客コード</th><th>名前</th><th>住所</th><th>電話番号</th></tr>
@foreach ($顧客達 as $顧客)
<tr>
<td>{{ $顧客->顧客コード }}</td>
<td>{{ $顧客->名前 }}</td>
<td>{{ $顧客->住所 }}</td>
<td>{{ $顧客->電話番号 }}</td>
</tr>
@endforeach
</table>
</body>
</html>
これで実行すると、一覧と新規投稿が動くと思います。
最後に
SQL Server、MySQLともに普通に日本語のテーブル名・カラム名が使えました。
PHPでも普通に日本語の識別子が使えます。