CakePHP4から外部のデータベースにアクセスする方法解説
2024/08/10
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4では標準(デフォルト)でデータベースにアクセスする方法が用意されていますが、標準で接続するデータベース以外の、他のシステムのデータベースに接続する方法について解説します。
他のシステムのデータベースに接続する方法は下記の 2つあります。
・CakePHP4 の標準設定をコピペして使用する方法
・MySQL の接続コマンドを利用する方法
いずれも簡単な記述で接続できます。
また、接続を確立した後の SQL文の実行はどちらも同じ手続きになります。
それぞれ説明をしていきます。
CakePHP4 の標準設定をコピペして使用する方法
データベースへの接続情報を記述・app.php
/config/app.php の 285行目付近の「Datasources」にデータベースの接続が記述されています。
この接続情報の中の 340行目付近の「test」の配列をコピペし、下記の 14行目の配列のキーを「sample」のように変更します。
複数の単語からなる文字列にする場合は、ローワーキャメルケース(「sampleTestTest」のような 1文字目は小文字のキャメルケース)を使用するようです。
また、接続するデータベースの設定に合わせて、「timezone」や「encoding」を変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
'test' => [ 'className' => Connection::class, 'driver' => Mysql::class, 'persistent' => false, 'timezone' => 'UTC', //'encoding' => 'utf8mb4', 'flags' => [], 'cacheMetadata' => true, 'quoteIdentifiers' => false, 'log' => false, //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], ], 'sample' => [ 'className' => Connection::class, 'driver' => Mysql::class, 'persistent' => false, 'timezone' => 'UTC', //'encoding' => 'utf8mb4', 'flags' => [], 'cacheMetadata' => true, 'quoteIdentifiers' => false, 'log' => false, //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], ], |
データベースへの接続情報を記述・app_local.php
続けて、/config/app_local.php の 40行目付近から始まる「Datasources」の中にある「test」をコピペして、下記の 11行目の配列のキーを「sample」のように変更します。
加えて、接続するデータベースの接続情報を記載します。
(DBの接続情報を「app_local.php」を使わず、「app.php」に直接記述している場合や、「.env」を利用している場合はそれぞれ読み替えて設定をしてください。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
'test' => [ 'host' => 'localhost', //'port' => 'non_standard_port_number', 'username' => 'my_app', 'password' => 'secret', 'database' => 'test_myapp', //'schema' => 'myapp', 'url' => env('DATABASE_TEST_URL', 'sqlite://127.0.0.1/tmp/tests.sqlite'), ], 'sample' => [ 'host' => 'localhost', 'port' => '33060', 'username' => 'sample_user', 'password' => '123456', 'database' => 'sample_db', //'schema' => 'myapp', 'url' => env('DATABASE_SAMPLE_URL', null), ], |
データベースへの接続と SQLの実行
データベースの接続を実行する記述方法はシンプルで、下記の記述で接続ができます。
「ConnectionManager::get()
」のパラメータに、前項で指定した「sample」を記述することで接続ができます。
1 2 3 4 5 6 7 |
// データベースへの接続 $sampleConnection = ConnectionManager::get('sample'); // SQL の SELECT文の実行 $sampleResults = $sampleConnection ->execute('SELECT * FROM sample_table') ->fetchAll('assoc'); |
上記の内容は、SQLを実行するコントローラー内に記述します。
MySQL の接続コマンドを利用する方法
データベースへの接続情報を記述
データベースの接続情報を設定します。
1 2 3 4 5 6 7 |
define("SAMPLE", [ "host" => "localhost", "port" => "33060", "users" => "sample_user", "password" => "123456", "database" => "sample_db", ]); |
上記の定数は、コントローラ内に記述してもいいですし、下記の記事にあるように、定数ファイルを作成し、そこに記述する方法もあるかと思います。
「CakePHP4で定数の設定と呼び出し方法の解説(defineとConfigure)」
「CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説」
また、今回はサンプルとして、データベース接続情報を定数として設定していますが、下記の「データベースの接続」のところに直書きしても問題ありません。
データベースへの接続と SQLの実行
続けて、データベースに接続し、SQLを実行する処理が下記となります。
1 2 3 4 5 6 7 8 9 |
// データベースへの接続 $dsn = 'mysql://' . SAMPLE["users"] . ':' . SAMPLE["password"] . '@' . SAMPLE["host"] . ":" . SAMPLE["port"] . '/' . SAMPLE["database"]; ConnectionManager::setConfig('sample', ['url' => $dsn]); $sampleConnection = ConnectionManager::get('sample'); // SQL の SELECT文の実行 $sampleResults = $sampleConnection ->execute('SELECT * FROM sample_table') ->fetchAll('assoc'); |
上記の内容は、SQLを実行するコントローラー内に記述します。
「SQL の SELECT文の実行」の部分の記述は、先に説明した「CakePHP4 の標準設定をコピペして使用する方法」の処理と同一です。
CakePHP4から外部のデータベースにアクセスする方法の違い
この記事では、CakePHP4から外部のデータベースにアクセスする方法が 2つあることを解説しました。
・CakePHP4 の標準設定をコピペして使用する方法
・MySQL の接続コマンドを利用する方法
上記の 2つのどちらがいいか、は好みの問題だと思います。
CakePHP4 Cookbook データベースの基本
https://book.cakephp.org/4/ja/orm/database-basics.html
ただ、上記のオフィシャルサイトには「データベース接続を作る一番簡単な方法」として「MySQL の接続コマンドを利用する方法」の方が紹介されています。
接続方法としてはどちらもかなり簡単なので、どちらでもいいかと思いますが、開発環境と本番環境でデータベースの接続先を変更するような場合は、「MySQL の接続コマンドを利用する方法」を利用し、データベースの接続先を環境ごとの定数ファイルで管理する方法がより簡単なのかな、と思います。
先にも紹介しましたが、環境ごとに定数ファイルを作成する方法については下記の記事を参考にしてください。
「CakePHP4で定数の設定と呼び出し方法の解説(defineとConfigure)」
「CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説」
データベースの接続情報オブジェクトを利用して SQL文を実行する
select文実行の標準形
データベースの接続情報を持つオブジェクトを利用し、SQLの実行は下記のように記述を行います。
1 2 3 4 |
// SQL の SELECT文の実行 $sampleResults = $sampleConnection ->execute("SELECT * FROM sample_table") ->fetchAll("assoc"); |
select文実行・where句はプリペアドステートメントを使用する
where句で条件を追加する際は、セキュリティを考慮してプリペアドステートメントを使用します。
1 2 3 4 5 |
// SQL の SELECT文の実行 $sampleResults = $sampleConnection ->execute('SELECT * FROM sample_table where height = :height and weight = :weight', ["height" => 170, "weight" => 60]) ->fetchAll("assoc"); |
select文実行・CakePHPのクリエビルダーを使用する
SQL文を書かずに、クリエービルダーを使用することもできます。
1 2 3 4 5 6 7 8 |
$sampleResults = $sampleConnection ->newQuery() ->select("*") ->from("sample_table") ->where(["height" => 170, "weight" => 60]) ->order(["name" => "ASC"]) ->execute() ->fetchAll("assoc"); |
Insert文実行の標準形
Insertの処理も非常に簡単です。
Insertの SQLを実行してもいいのですが、下記のように記述することで Insertを実行することができます。
1 2 3 4 5 6 7 |
$insertData = [ "id" => 1, "name" => "名前1", "height" => "171", "weight" => "61", ]; $sampleConnection->insert("sample_table", $insertData); |
ちなみに、上記の Insertを実行しても自動的に「created」「modified」のカラムを編集する処理はありませんので、必要に応じて「created」「modified」の値を編集しておく必要があります。
Update文実行の標準形
Updateの処理も非常に簡単です。
1 2 3 4 5 |
$updateData = [ "height" => "176", "weight" => "66", ]; $sampleConnection->update("sample_table", $updateData, ["id" => 1]); |
上記を SQLに書き直すと下記になります。
1 |
update sample_table set height = 176, weight = 66 where id = 1; |
Delete文実行の標準形
Deleteの処理も非常に簡単です。
1 |
$sampleConnection->delete("sample_table", ["id" => 1]); |
SQL文実行に際しては「try – catch」を利用する
SQL文の実行処理は簡単ですが、この記述だけで処理をすると、エラーが発生したときに処理が止まってしまいます。
そのため、プログラムとして実装する場合は「try – catch」を利用してエラーへの対処をしておく必要があるかと思います。
1 2 3 4 5 6 7 8 9 |
try { // SQL の SELECT文の実行 $sampleResults = $sampleConnection ->execute("SELECT * FROM sample_table") ->fetchAll("assoc"); } catch (\Exception $e) { // エラーが発生したときはログを出力 $this->log($e->getMessage(), "error", ['scope' => ['sqlError']]); } |
上記のサンプルは Selectの実行ですが、同様に Insert、Update、Deleteを実行するときも「try – catch」を利用してエラーの対処をするものかと思います。
また、ログ出力に関しては下記に記事を書いていますので参考にしてください。
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP4の関連記事
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。
-
CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを
CakePHP3でルーティングの設定変更をしたけど反映されない!そんなときは慌てず騒がずキャッシュをクリアしよう!ルーティングの設定もキャッシュされることがあるらしい。
-
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でCSVファイルをアップロードしレコードを追加、更新する処理の作成方法の解説。モデルとは直接関連しないフォームからCSVファイルをアップロードするため汎用的に使用可能。
-
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3でOGPを設定する方法を解説。fetch、assignを使用しレイアウトファイルに編集した変数にテンプレートファイルから値を指定する。これを利用してOGPを編集する。
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
CakePHP 2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHPの検索プラグイン Search Pluginの検索処理の中で前方一致検索、後方一致検索、不等号による検索、between句による範囲検索の解説です。
-
CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
CakePHP 2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHPの検索プラグイン Search Pluginの検索処理の中で入力エリア一つで複数の項目を同時に検索する方法を解説。
-
CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説
CakePHP4のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。