CakePHP3に直接SQLを書く方法で、ストアドプロシージャを利用してみたいと思います。
ストアドプロシージャでは、他テーブルへの処理や複雑なクエリーなど色々と出来るうえ、メンテナンスも行い易いです。
##やりたい事
以下の様なURLで追加処理した際、ストアドプロシージャを使って全く別テーブルに対して追加処理を行いたいと思います。
http://localhost:8000/posts/add
##環境
CakePHP3.5.x
MySQL
##データベースの準備
他テーブル(sub_tables)に対して更新系の処理を行いたいと思います。
下記のストアドプロシージャを作成後、phpMyAdminでもコマンドラインからでも構いませんので、CALL st_add('hogehoge');
とSQL実行すると、sub_tablesに**hogehoge
**が挿入されていますので確認して下さい。
※ストアドプロシージャが正しく動いていないとCakePHPに問題があるのかMySQL側の問題なのか切り分けが出来ないため。
####サブテーブルを作成
CREATE TABLE `sub_tables` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
####ストアドプロシージャを作成
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `st_add`(IN `parm1` VARCHAR(50))
NO SQL
INSERT INTO sub_tables
(name)
VALUES
(parm1)$$
DELIMITER ;
##Controllerの修正
CakePHP3で直接SQLが実行するようにController側にConnectionManagerを使います。
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Datasource\ConnectionManager; // 追加
class PostsController extends AppController
{
public function add()
$post = $this->Posts->newEntity();
if ($this->request->is('post')) {
// POSTデータを変数に格納
$mydata = $this->request->getData();
// 直接SQLを書くには ConnectionManager::get が必要ので 一番上のuse文も忘れずに。
$con = ConnectionManager::get('default');
// トランザクション処理
//※ストアドプロシージャの場合、機能するかは未確認
$con->begin();
// 直接SQLでストアドプロシージャを実行(POSTの'title'をパラメータとします)
$con->execute('CALL st_add(:name)',[
'name' => $mydata['title']
]);
$con->commit();
return $this->redirect(['action' => 'index']);
}
$this->set(compact('post'));
$this->set('_serialize', ['post']);
}
##その他
sub_tables
テーブルに対して追加処理していますが、CakePHP側でsub_tables
テーブルのMVCを作る必要はありません。
##参考サイト