Skip to main content
Laravel は、ORM (Eloquent)、移行機能、artisan コマンドラインツールを標準で備えた PHP の Web フレームワークです。このガイドでは、新規作成した Laravel アプリの接続先を ClickHouse Managed Postgres に設定し、移行で tasks テーブルを作成して、その行をルート経由で返します。すべての接続で、証明書を完全に検証する TLS を使用します。

前提条件

  • PHP 8.3 以降 (Laravel 13 の要件) および pdo_pgsql 拡張機能。php -m を実行して、一覧に pdo_pgsql が含まれていることを確認してください。
  • Composer
  • ClickHouse Cloud アカウント
  • データベース作成用の psql。CREATE DATABASE ステートメントは SQL コンソール で実行することもできます。

ClickHouse Managed Postgres サービスを作成する

ClickHouse Cloud コンソールで New service をクリックし、Postgres を選択します。インスタンスは数分で利用可能になります。詳しい手順については、クイックスタートを参照してください。

接続情報を取得する

サービスの左サイドバーにある Connect をクリックします。表示されるモーダルには、ユーザー名、パスワード、サーバー、ポートが表示されます。また、Directly / via PgBouncer を切り替えるトグルもあります。 PHP アプリはリクエスト間で接続プールを保持しません。デフォルトでは、リクエストごとに新しい Postgres 接続を開き、リクエストの終了時にその接続を閉じます。このガイドでは、同梱の PgBouncer を経由してポート 6432 でアプリを接続します。これにより、こうした短時間の接続が少数の Postgres バックエンドを共有できます。一方、移行は DDL を実行し、トランザクションを長時間保持する場合があるため、ポート 5432 で Postgres に直接接続します。 via PgBouncer を選択すると、プール経由の接続情報が表示されます。ポートが 6432 に変わり、接続文字列には sslmode=verify-full が含まれます。 同じモーダルで Download CA certificate をクリックします。Settings → CA Certificate からもダウンロードできます。この証明書はインスタンスごとに固有のものです。そのため、ドライバーはこれを使って、接続先が確かに自分のサーバーであることを検証できます。

プロジェクトのセットアップ

Laravel プロジェクトを作成します。
既存のアプリに追加する場合composer create-project はスキップしてください。プロジェクトで php -m の出力に pdo_pgsql が含まれていることを確認してから、このセクションの残りの手順を実施し、接続を設定する に進んでください。この手順で、アプリの接続先が SQLite から Postgres に切り替わります。その後 php artisan migrate を実行すると既存のテーブルが Postgres 上に作成されますが、SQLite のデータはコピーされません。
ダウンロードした CA 証明書をプロジェクトディレクトリに移動し、ca-certificate.pem にリネームします。 アプリ用のデータベースを作成します。<PASSWORD> とホストは、Connect モーダルに表示される値に置き換えてください。

接続を設定する

Laravel はデフォルトで SQLite を使用します。.env を開き、DB_CONNECTION=sqlite の行と、その下でコメントアウトされている DB_ の行を、次の内容に置き換えてください。
.env
ca-certificate.pem には絶対パスを指定してください。libpq は相対パスを PHP プロセスの作業ディレクトリを基準に解決しますが、この作業ディレクトリは PHP によるアプリケーションの実行方法によって変わります。パスワードに空白や # が含まれる場合は、ダブルクォートで囲んでください。また、.env はバージョン管理の対象に含めないでください。 config/database.php のデフォルトの pgsql 接続は DB_SSLMODE を読み取りますが、CA 証明書のパスは読み取りません。config/database.php を開き、pgsql 接続に sslrootcert と options のエントリを追加します。
config/database.php
Laravel は PDO DSN に sslmode と sslrootcert を付加し、pdo_pgsql 拡張機能がそれらを libpq に渡します。libpq は証明書チェーンとホスト名を検証します。 PDO::ATTR_EMULATE_PREPARES を設定すると、PDO はサーバー側のプリペアドステートメントを作成せず、値をあらかじめバインドした状態で各クエリを送信します。PgBouncer 経由で接続する場合は、この設定を有効にしてください。pdo_pgsql が libpq 16 以前に対してビルドされている場合 (Debian 12 など) 、PHP は各プリペアドステートメントを SQL の DEALLOCATE ステートメントで解放します。PgBouncer はサーバー上でプリペアドステートメントをリネームするため、この DEALLOCATE は失敗します。トランザクション内でこれが発生するとトランザクションが中断され、以降のクエリは current transaction is aborted で失敗します。libpq 17 以降であれば、デフォルト設定のままでも問題なく動作します。使用しているバージョンは php -i | grep libpq で確認できます。 接続を確認します:
sslrootcert の行がない場合、libpq はデフォルトの CA の場所にフォールバックするため、verify-full は root certificate file ".../.postgresql/root.crt" does not exist というエラーで失敗します。誤った CA を指定した場合は、SSL error: certificate verify failed というエラーで接続に失敗します。

モデルと移行を作成する

tasks テーブル用の Eloquent モデルと移行を生成します:
database/migrations/ に作成された新しい移行ファイル (ファイル名の末尾は _create_tasks_table.php) を開き、up メソッドに title カラムと done カラムを追加します。
database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php
各カラムを一括代入 (mass assignment) できるようにし、done がブール値として返されるよう、app/Models/Task.php を次の内容に置き換えます:
app/Models/Task.php
直接接続経由で移行を実行します。環境変数は .env 内の値をオーバーライドするため、変更が必要なのはポートだけです。
これにより、tasks のほかに、新しい Laravel アプリがデフォルトで使用する users、sessions、cache、jobs 用のテーブルも作成されます。Laravel は適用済みの移行を migrations テーブルに記録するため、2 回目以降の実行では新しい移行のみが実行されます。

データベースにクエリを実行する

artisan tinker から Eloquent を使用して、いくつかの行を追加します。
すべてのタスクを JSON 形式で返すルートを、routes/web.php の末尾に追加します。
routes/web.php
Laravel は接続時に、search_path、timezone、isolation_level の接続オプションを session レベルの SET ステートメントで適用しますが、PgBouncer を経由すると、これらの設定はトランザクション間で引き継がれません。これらのオプションはデフォルトのままにするか、必要な場合はポート 5432 に直接接続してください。また、LISTEN や session アドバイザリロックといった session レベルの機能も、PgBouncer 経由では動作しません。詳しくはよくある質問を参照してください。

実行と動作確認

開発サーバーを起動します。
ブラウザで http://localhost:3104/tasks を開くと、次のようなレスポンスが返されます。
コンソールでデータを確認するには、サービスの左サイドバーから SQL コンソール を開き、guide_laravel、public の順に展開して tasks テーブルをクリックします。public スキーマには、users、sessions、migrations など、Laravel がデフォルトで作成するテーブルも表示されます。

次のステップ

最終更新日 2026年10月14日