エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP3で生の SQLの実行はConnectionManagerを使う

      2019/03/02

CakePHP3でクリエビルダーを使わず生の SQL文を実行する方法を解説

 

CakePHP3で生の SQL文を実行する方法を解説

 
CakePHP3で直接 SQL文を実行する方法を解説します。
 
【参考サイト】CookBook データベースの基本
https://book.cakephp.org/3.0/ja/orm/database-basics.html
 
CakePHP3において、直接 SQL文を実行する方法は、上記の CakePHP3の Cookbookにも書いてあるのですが、非常に簡単で、データベースにアクセスする方法としては基本形のようです。
 
 
ただ、CakePHP3のようなフレームワークを使う理由は、SQL文を作成しなくても簡単にデータベースにアクセスできるから、といったこともあるワケですが、より簡単にアクセスするには、クエリービルダーを利用します。
 
【参考サイト】CookBook クエリービルダー
https://book.cakephp.org/3.0/ja/orm/database-basics.html
 
 
今回の記事は、クエリービルダーでは対応できないデータベースへのアクセスを、SQL文を作成して対応する方法を解説します。
 

 

CakePHP3で生の SQL文を実行する方法・基本形

 
生の SQL文を実行する方法は、以下のようになります。
 

use Cake\Datasource\ConnectionManager;
 
$connection = ConnectionManager::get('default');
$results = $connection->execute('SELECT * FROM articles')->fetchAll('assoc');

 
クリエービルダーを使ってデータベースにアクセスするときは「use Cake\ORM\TableRegistry;」を使いますが、生の SQL文を実行するときは「use Cake\Datasource\ConnectionManager;」を記述します。
 
 
「ConnectionManager::get('default');」の「default」は、データベース名、テーブル名などではないことには注意が必要です。
 
この「default」は、データベースの接続設定です。
 
「/config/app.php」にデータベースに関する設定項目として「Datasources」があり、その中で「default」「test」の設定を記述しているかと思います。
 
この「default」を使います、という指定です。
 
逆に言うと、1つの処理の流れの中で、「default」で設定しているデータベースではないデータベースに接続して処理をしたい場合には、「default」とは違うデータベースへの接続設定を作成し、この「ConnectionManager」を利用して接続できます。
 
 

CakePHP3で生の SQL文を実行する方法・INSERT文、UPDATE文、DELETE文

 
前項で紹介したのは SELECT文ですが、INSERT文、UPDATE文、DELETE文でも同じです。
 
INSERT文の場合は下記の様になります。
 

use Cake\Datasource\ConnectionManager;
 
$connection = ConnectionManager::get('default');
$connection->execute('INSERT INTO articles (col_1, col_2, col_3) value ("aaa", "bbb", "ccc")');

 
上記と同じように SQL文を UPDATE文、DELETE文に変えることでその処理を実行することができます。
 
 

CakePHP3で生の SQL文を実行する方法・プリペアードステートメントを利用する方法

 
続いて、プリペアードステートメントを使って SQL文の処理を行う場合の解説を行います。
 
前項で解説した、INSERT文をプリペアードステートメントを用いて書き直すと下記の様になります。
 

use Cake\Datasource\ConnectionManager;
 
$connection = ConnectionManager::get('default');
// INSERTの SQL文を生成
$insertSql   = 'INSERT INTO articles (col_1, col_2, col_3) value (?, ?, ?)';
// INSERTする値を配列として作成
$insertArray = ["aaa", "bbb", "ccc"];
// SQL文の実行
$connection->execute($insertSql, $insertArray);

 
上記のソース中にコメントを書いていますので問題ないかと思いますが、SQL文と値となる配列を別々に作成し、「$connection->execute()」の引数として記述するだけです。
 

 

CakePHP3で Insert On Duplicate Key Update構文を利用する

 
今回、私が生の SQL文を実行する必要があった理由は、Insert On Duplicate Key Update構文を使用するためでした。
 
CakePHP3ではクリエビルダーを使って Insert On Duplicate Key Update構文を実行する方法が分からず、生の SQL文を書いて Insert On Duplicate Key Update構文を実行しようとしたため、今回の生の SQL文を実行する方法が必要でした。
 
Insert On Duplicate Key Update構文を、プリペアードステートメントを利用して実行しようとすると、下記の様になります。
 

use Cake\Datasource\ConnectionManager;
 
// INSERTの SQL文を生成
$insertSql   = 'INSERT INTO articles (col_1, col_2, col_3) value (?, ?, ?)
                ON DUPLICATE KEY UPDATE col_1 = ?,col_2 = ?,col_3 = ?';
// INSERTする値を配列として作成
$insertArray = ["aaa", "bbb", "ccc", "aaa", "bbb", "ccc"];
// SQL文の実行
$connection->execute($insertSql, $insertArray);

 
 
CakePHP2で開発しているときも同じ必要性があったのですが、その時も生の SQL文を実行する方法で対処しています。
その時に書いた記事が下記にあります。
 
Insert On Duplicate Key Update構文の使い方
CakePHP 2.3でOn Duplicate Key構文を実装
 
 

SQL文を実行したときのエラーログを取得する方法

 
今回の記事の趣旨とは違いますが、CakePHP3で SQL文を実行してエラーになったとき、どのようなエラーなのかを確認するため、エラーログを取得する場合は下記のような記述を行います。
 

try {
	$tableObjectConnection->execute($insertSql);
} catch (\Cake\ORM\Exception\PersistenceFailedException $e) {
	echo $e;
	echo $e->getEntity();
}

 
詳しい使い方は「CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説」に記事を書いていますので、そちらも参照してください。
 
 

CakePHP3の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定

CakePHPのアップロードするファイル名を乱数で変更しセキュリティを高める方法を解説。

CakePHP3でレコードを追加、更新(Insert、Update)する複数の方法を紹介
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介

CakePHP3でレコードを追加、更新(Insert、Update)する記述方法を解説。1件ずつ処理、全件をまとめて処理、条件に該当する複数件のレコードを処理方法をサンプルコードを用いて解説。

CakePHP 2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能

CakePHPの検索プラグイン Search Pluginの検索処理の中で order、ソートについての解説です。

CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法

CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。

CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法

アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。

CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介
CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介

PHPでサーバ情報、環境情報を取得する際は「$_SERVER」を利用するが、似たような情報をCakePHPの関数で取得する際は「getUri()」を使用する。取得出来る値は一致するものもあるが、違うものもあり便利な使い方もある。

CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法

CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングをする方法を解説。インストール方法、読み込み方法。および、具体的なスクレイピングを実行するサンプルソースも。

CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法

CakePHP4系、5系のログイン認証の可否のチェック、および、ログインユーザの情報を取得する方法のまとめ。複数の方法があるが手続きが微妙に異なるためまとめてみた。

CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3で保存前にバリデーション結果を取得する2つの方法

CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。

CakePHP 2.3 Search Pluginで検索処理 その1設置方法

CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。