※このブログは2022年03月22日に公開された英語ブログ「Getting Started with TiDB Cloud Using PHP and Laravel」の拙訳です。
著者: Chenhao Huang (開発者リレーション)
編集者: Calvin Weng, Tom Dewan
TiDB Cloudは、フルマネージドなDatabase-as-a-Service(DBaaS)です。TiDBの優れた点をすべてクラウドに取り込み、データベースの煩雑さに囚われることなく、アプリケーションに集中できるようにします。
このチュートリアルでは、PHPアプリケーションのバックエンドデータベースとしてTiDB Cloudを使用する方法について学びます。PHPとLaravelを使用して、シンプルな Webアプリケーションを構築します。主に、次の内容について触れます。
- TiDB CloudでTiDBデータベースを起動します。
- ローカルマシンにLaravelをインストールします。
- アプリケーションのロジックを記述します。
- Laravelアプリケーションを実行します。
始める前に
TiDB Developer Tierクラスタの作成
- TiDB Cloudのアカウントをお持ちでない方は、こちらをクリックしてアカウントを取得してください。
- TiDB Cloudのアカウントにログインします。
- ランディングページで、[Create Cluster] をクリックします。
- プラン選択ページで、Developer Tierプランの「Get Started for Free」をクリックします。
- [Create Cluster] ページで、クラスタ名とルートパスワードを設定します。(このチュートリアルでは、このクラスタをデモと呼びます)。
- クラスタを作成するために、自分に近いクラウドサービスリージョンを選択します。クラウドプロバイダーはAWSです。
- クラスタのティアを選択してください。デフォルトは
S1.dev
です。 - [Create] をクリックします。
TiDB Cloudクラスタは約5〜10分で作成されます。
TiDB Cloudに接続する
- https://tidbcloud.com/console/clusters にアクセスし、クラスタにサインインします。
- TiDB Cloudコンソールで、パネルの右上にある [Connect] をクリックします。
- [Connect to TiDB] ダイアログで、クラスタのトラフィックフィルタを作成します。
- ステップ1で、[Allow Access from Anywhere] をクリックします。(このオプションは、このチュートリアルの目的ではOKですが、実運用では推奨されません)。
- [Create Filter] をクリックします。
- 「Web SQL Shell」タブで、[Open SQL Shell] をクリックし、クラスタのパスワードを入力します。これで、SQLを書くことができるようになりました。
データベースの作成
- SQLシェルで、アプリケーションが使用する laravel_demo データベースを作成します。
CREATE DATABASE laravel_demo;
- データベースユーザーを作成します。ユーザー名は ‘
demo_client
‘,とし ‘<pwd>
‘の代わりに ‘PingCAP1
‘のような独自のパスワードを設定する必要があります。CREATE USER 'demo_client' IDENTIFIED BY '<pwd>';
- 作成したユーザーに下記の権限を付与します。繰り返しますが、これはチュートリアル用であり、実運用にはお勧めしません。
GRANT ALL PRIVILEGES ON *.* TO 'demo_client';
Laravelプロジェクトの準備
- TiDB Cloudのホストアドレスを取得します。このアドレスは後のステップで入力することになります。TiDB Cloudのトップページで、[Connect] をクリックします。Connect to TiDB」ページで、「Step 2: Connect with a SQL client」にあるホストアドレスが、
xxx.xxxx.xxxx.xxxx.prod.aws.tidbcloud.com
という形式で表示されています。 laravel-demo
というLaravelのプロジェクトを作成します。composer create-project laravel/laravel laravel-demo
laravel-demo
というディレクトリが作成されているのが確認できます。そのディレクトリに移動します。cd laravel-demo
.env
設定ファイルを編集します。DB_HOST
をTiDB Cloudのホストアドレスに、<pwd>
をパスワードに置き換えてください。DB_CONNECTION=mysql
DB_HOST=xxx.xxxx.xxxx.xxxx.prod.aws.tidbcloud.com
DB_PORT=4000
DB_DATABASE=laravel_demo
DB_USERNAME=demo_client
DB_PASSWORD=<pwd>
アプリケーションを書く
アプリケーションのデータベース接続を設定した後、アプリケーションを構築することができます。アプリケーションのロジックを書くには、モデルの定義、コントローラの作成、URLルートの更新が必要です。
モデルを定義する
Laravelはテーブルと対話するために、ORM(Object Relational Mapping)フレームワークであるEloquentモデルを使用します。モデルは通常、appModelsディレクトリに配置されます。以下のステップを使用して、モデルを作成し、対応するテーブルとモデルをマッピングします。
- 新しいモデルを生成し、データベースにマイグレーションします。ルートディレクトリの下で、
make:model
Artisanコマンドを使用します。php artisan make:model Order -m
php artisan make:model Customer -m
- オーダーテーブルを作成します。
database/migrations
ディレクトリで、<recent_time_stamp>_create_orders_table.php
ファイルを開いてください。<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateOrdersTable extends Migration
{
/**
* Runs the migrations.
*
* @return void
*/
public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->bigIncrements('oid');
$table->bigInteger('cid');
$table->float('price');
});
}
/**
* Reverses the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('orders');
}
}
?>
- 新規に顧客テーブルを作成します。
database/migrations directory
、<recent_time_stamp>_create_customers_table.php
を開いてください。<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCustomersTable extends Migration
{
/**
* Runs the migrations.
*
* @return void
*/
public function up()
{
Schema::create('customers', function (Blueprint $table) {
$table->bigIncrements('cid');
$table->string('name',100);
});
}
/**
* Reverses the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('customers');
}
}
?>
- 新しいテーブルを作ります。プロジェクトのルートフォルダにいることを確認し、migrate Artisanコマンドを使用します。
php artisan migrate
app/Models
ディレクトリに移動します。- フレームワークがOrderモデルで使用するテーブルを指定します。
app/Models/Order.php
ファイルを編集します。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected $table = 'orders';
protected $primaryKey = 'oid';
public $timestamps = false;
protected $fillable = [
'cid',
'price',
];
protected $guarded = [
'oid',
];
protected $casts = [
'uid' => 'real',
'price' => 'float',
];
use HasFactory;
}
?>
- 顧客モデルに使用するテーブルを指定します。
app/Models/Customer.php
を編集します。<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Customer extends Model
{
use HasFactory;
protected $table = 'customers';
protected $primaryKey = 'cid';
public $timestamps = false;
protected $fillable = [
'name',
];
protected $guarded = [
'cid',
];
protected $casts = [
'name' => 'string',
'cid' => 'int',
];
}
?>
コントローラを作成する
- コントローラを作成します。コマンドラインで、次のように入力します。
php artisan make:controller CustomerController
php artisan make:controller OrderController
- 顧客テーブルに対するコントローラを編集します。
app/Http/Controllers/CustomerController.php
ファイルを編集します。
<?php
namespace App\Http\Controllers;
use App\Models\Customer;
use Illuminate\Http\Request;
class CustomerController extends Controller
{
public function getByCid($cid)
{
$customer_info = Customer::where('cid',$cid)->get();
if ($customer_info->count() > 0){
return $customer_info;
}
return abort(404);
}
public function insert(Request $request) {
return Customer::create(['name' => $request->name]);
}
}
?> - オーダーテーブルに対するコントローラを編集します。
app/Http/Controllers/OrderController.php
ファイルを編集します。
<?php
namespace App\Http\Controllers;
use App\Models\Order;
use Illuminate\Http\Request;
class OrderController extends Controller
{
public function insert(Request $request) {
return Order::create(['cid' => $request->cid, 'price' => $request->price]);
}
}
?>
URLルートを更新する
URLルーティングは、リクエストURLを受け入れるようにアプリケーションを設定することができます。アプリケーションのルートのほとんどは、routes/api.phpファイルで定義されます。最も単純なLaravelのルートは、URIとクロージャコールバックで構成されています。
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\customerController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Route::post('/customer', 'App\Http\Controllers\CustomerController@insert');
Route::post('/order', 'App\Http\Controllers\OrderController@insert');
?>
Laravelアプリケーションを実行する
- 以下のコマンドを実行し、Laravelアプリケーションを起動します。
php artisan serve
- いくつかのサンプルデータを挿入して、アプリケーションをテストしてください。新しいターミナルウィンドウを開き、以下のコマンドを実行してください。
- 顧客テーブルに “Peter “という名前の顧客を挿入します
curl --location --request POST 'http://127.0.0.1:8000/api/customer' --form 'name="Peter"'
- オーダーテーブルにレコードを挿入する。
curl --location --request POST 'http://127.0.0.1:8000/api/order' --form 'cid=1' --form 'price="3.12"'
- 顧客テーブルに “Peter “という名前の顧客を挿入します
- 挿入が成功したかどうかを確認します。Web SQLシェルで、次のステートメントを実行します。
select * from laravel_demo.orders;
oid | cid | price
-----+-----+-------
1 | 1 | 3.12
(1 rows)
上の結果は、データの挿入が成功したことを示しています。また、顧客テーブルにデータが挿入されたかどうかを確認することもできます。
もっと知りたいですか?
TiDB Cloudを試す準備はできましたか?TiDB CloudのDeveloper Tierが利用可能になりました! Amazon Web Services上でTiDBクラスタを1年間無料で運用することができます。TiDB Cloudの最新情報は、Twitterでフォローしてください。
TiDB Cloud Dedicated
TiDB Cloudのエンタープライズ版。
専用VPC上に構築された専有DBaaSでAWSとGoogle Cloudで利用可能。
TiDB Cloud Serverless
TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。