3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP3でストアドプロシージャを使った更新系の処理

Posted at

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側の問題なのか切り分けが出来ないため。

####サブテーブルを作成

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;

####ストアドプロシージャを作成

MySQL
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を使います。

src¥Controller¥PostsController.php
<?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を作る必要はありません。
##参考サイト

https://book.cakephp.org/3.0/ja/orm/database-basics.html

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?