※このブログは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-demolaravel-demoというディレクトリが作成されているのが確認できます。そのディレクトリに移動します。cd laravel-demo.env設定ファイルを編集します。DB_HOSTをTiDB Cloudのホストアドレスに、<pwd>をパスワードに置き換えてください。DB_CONNECTION=mysqlDB_HOST=xxx.xxxx.xxxx.xxxx.prod.aws.tidbcloud.comDB_PORT=4000DB_DATABASE=laravel_demoDB_USERNAME=demo_clientDB_PASSWORD=<pwd>
アプリケーションを書く
アプリケーションのデータベース接続を設定した後、アプリケーションを構築することができます。アプリケーションのロジックを書くには、モデルの定義、コントローラの作成、URLルートの更新が必要です。
モデルを定義する
Laravelはテーブルと対話するために、ORM(Object Relational Mapping)フレームワークであるEloquentモデルを使用します。モデルは通常、appModelsディレクトリに配置されます。以下のステップを使用して、モデルを作成し、対応するテーブルとモデルをマッピングします。
- 新しいモデルを生成し、データベースにマイグレーションします。ルートディレクトリの下で、
make:modelArtisanコマンドを使用します。php artisan make:model Order -mphp artisan make:model Customer -m - オーダーテーブルを作成します。
database/migrationsディレクトリで、<recent_time_stamp>_create_orders_table.phpファイルを開いてください。<?phpuse 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を開いてください。<?phpuse 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ファイルを編集します。
<?phpnamespace 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を編集します。<?phpnamespace 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 CustomerControllerphp artisan make:controller OrderController - 顧客テーブルに対するコントローラを編集します。
app/Http/Controllers/CustomerController.phpファイルを編集します。
<?phpnamespace 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ファイルを編集します。
<?phpnamespace 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とクロージャコールバックで構成されています。
<?phpuse 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 Starter
TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。