TiDB User Day 2024のアーカイブ動画を公開中!詳細を見る
php_laravel_tutorial

※このブログは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アプリケーションを構築します。主に、次の内容について触れます。

  1. TiDB CloudでTiDBデータベースを起動します。
  2. ローカルマシンにLaravelをインストールします。
  3. アプリケーションのロジックを記述します。
  4. Laravelアプリケーションを実行します。

始める前に

  • PHP (v. 8+) をインストールします。
  • Composerをインストールします。
  • Composerを使用して、Laravelをインストールします。

TiDB Developer Tierクラスタの作成

  1. TiDB Cloudのアカウントをお持ちでない方は、こちらをクリックしてアカウントを取得してください。
  2. TiDB Cloudのアカウントにログインします。
  3. ランディングページで、[Create Cluster] をクリックします。
  4. プラン選択ページで、Developer Tierプランの「Get Started for Free」をクリックします。
  5. [Create Cluster] ページで、クラスタ名とルートパスワードを設定します。(このチュートリアルでは、このクラスタをデモと呼びます)。
  6. クラスタを作成するために、自分に近いクラウドサービスリージョンを選択します。クラウドプロバイダーはAWSです。
  7. クラスタのティアを選択してください。デフォルトは S1.devです。
  8. [Create] をクリックします。

TiDB Cloudクラスタは約5〜10分で作成されます。

TiDB Cloudに接続する

  1. https://tidbcloud.com/console/clusters にアクセスし、クラスタにサインインします。
  2. TiDB Cloudコンソールで、パネルの右上にある [Connect] をクリックします。
  3. [Connect to TiDB] ダイアログで、クラスタのトラフィックフィルタを作成します。
    1. ステップ1で、[Allow Access from Anywhere] をクリックします。(このオプションは、このチュートリアルの目的ではOKですが、実運用では推奨されません)。
    2.  [Create Filter] をクリックします。
  4. 「Web SQL Shell」タブで、[Open SQL Shell] をクリックし、クラスタのパスワードを入力します。これで、SQLを書くことができるようになりました。

データベースの作成

  1. SQLシェルで、アプリケーションが使用する laravel_demo データベースを作成します。
    CREATE DATABASE laravel_demo;
  2. データベースユーザーを作成します。ユーザー名は ‘demo_client‘,とし ‘<pwd>‘の代わりに ‘PingCAP1‘のような独自のパスワードを設定する必要があります。
    CREATE USER 'demo_client' IDENTIFIED BY '<pwd>';
  3. 作成したユーザーに下記の権限を付与します。繰り返しますが、これはチュートリアル用であり、実運用にはお勧めしません。
    GRANT ALL PRIVILEGES ON *.* TO 'demo_client';

Laravelプロジェクトの準備

  1. TiDB Cloudのホストアドレスを取得します。このアドレスは後のステップで入力することになります。TiDB Cloudのトップページで、[Connect] をクリックします。Connect to TiDB」ページで、「Step 2: Connect with a SQL client」にあるホストアドレスが、xxx.xxxx.xxxx.xxxx.prod.aws.tidbcloud.comという形式で表示されています。
  2. laravel-demoというLaravelのプロジェクトを作成します。
    composer create-project laravel/laravel laravel-demo
  3. laravel-demoというディレクトリが作成されているのが確認できます。そのディレクトリに移動します。
    cd laravel-demo
  4. .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ディレクトリに配置されます。以下のステップを使用して、モデルを作成し、対応するテーブルとモデルをマッピングします。

  1. 新しいモデルを生成し、データベースにマイグレーションします。ルートディレクトリの下で、make:model Artisanコマンドを使用します。
    php artisan make:model Order -m
    php artisan make:model Customer -m
  2. オーダーテーブルを作成します。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');
        }
    }
    ?>
  3. 新規に顧客テーブルを作成します。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');
       }
    }
    ?>
  4. 新しいテーブルを作ります。プロジェクトのルートフォルダにいることを確認し、migrate Artisanコマンドを使用します。
    php artisan migrate
  5. app/Modelsディレクトリに移動します。
  6. フレームワークが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;
    }
    ?>
  7. 顧客モデルに使用するテーブルを指定します。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',
        ];
    }
    ?>

コントローラを作成する

  1. コントローラを作成します。コマンドラインで、次のように入力します。
    php artisan make:controller CustomerController
    php artisan make:controller OrderController
  2. 顧客テーブルに対するコントローラを編集します。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]);
    }
    }
    ?>
  3. オーダーテーブルに対するコントローラを編集します。 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アプリケーションを実行する

  1. 以下のコマンドを実行し、Laravelアプリケーションを起動します。
    php artisan serve
  2. いくつかのサンプルデータを挿入して、アプリケーションをテストしてください。新しいターミナルウィンドウを開き、以下のコマンドを実行してください。
    • 顧客テーブルに “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"'
  3. 挿入が成功したかどうかを確認します。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でフォローしてください。


Have questions? Let us know how we can help.

Contact Us

TiDB Cloud Dedicated

TiDB Cloudのエンタープライズ版。
専用VPC上に構築された専有DBaaSでAWSとGoogle Cloudで利用可能。

TiDB Cloud Serverless

TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。