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文を実行する方法は、以下のようになります。
|
1 2 3 4 |
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文の場合は下記の様になります。
|
1 2 3 4 |
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文をプリペアードステートメントを用いて書き直すと下記の様になります。
|
1 2 3 4 5 6 7 8 9 |
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構文を、プリペアードステートメントを利用して実行しようとすると、下記の様になります。
|
1 2 3 4 5 6 7 8 9 |
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文を実行してエラーになったとき、どのようなエラーなのかを確認するため、エラーログを取得する場合は下記のような記述を行います。
|
1 2 3 4 5 6 |
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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
Bakeして自動生成した入力フォーム処理を元に少し処理を追加したら、入力エラーがあってもエラーメッセージが表示されなくなった。原因はリダイレクトの処理にあった。
-
-
CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説
WYSIWYGエディタであるCKEditor4をCDNを利用して簡単にCakePHP3に導入する方法とカスタマイズする方法を解説。CakePHP3にはページごとの振り分けを行うブロック化を利用する。
-
-
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4でテンプレートやレイアウトファイルをデフォルトから変更する場合は「render()」を使用するが、記述場所はできるだけコントローラー内の最後の方に書く方がいい。
-
-
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHPのログ出力方法の解説。app.phpにログ設定をし、スコープやレベルを指定してログ出力を振り分ける方法、CakePHP4で配列出力にはvar_exportが必要なことなどを解説。
-
-
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
CakePHP4で定数に変数を埋め込み、翻訳機能「__()」で変数に値を入れる方法を紹介。定型の文章の一部だけを置換したい場合に利用すると便利。
-
-
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
CakePHPのバージョンの調べ方2点を紹介。CakePHP3~CakePHP5は共通だが CakePHP2はフォルダ構成が異なるためコマンドのパスもオプションも異なる。
-
-
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4系、5系のログイン認証の可否のチェック、および、ログインユーザの情報を取得する方法のまとめ。複数の方法があるが手続きが微妙に異なるためまとめてみた。
-
-
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHPには「FrozenDate」の日付を扱う関数が用意されている。これを利用して、1ヶ月後、月末日、月初日、5日後などを指定して日付を取得できる。それを解説。
-
-
CakePHP3、CakePHP4のdatetime型カラムの日時の扱い。秒まで表示する方法
CakePHP3の日時カラムで秒まで扱う場合はdate()、strtotime()関数ではうまくいかない。CakePHP3であらかじめ用意された「i18nFormat()」を使用する。
-
-
CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方
CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。