cakePHP3のモデル(table/entity)の使い方(正しい作法?)について
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 3,302
これまでCakePHP2を我流で勝手に使っていたのですが、
「それじゃフレームワークを使っている意味がないよ」という指摘を受けました。
データの操作に関わる部分を、生のSQLで書いていたり、MySQLにストアドプロシージャを書いて、
実行していたりしたためです。
じゃあ正しいフレームワークの使い方(作法)として、Modelをどう使えばいいのかが、
マニュアル等を読んでもいまひとつわかりません。
仮に以下のような処理を行おうとした場合、
modelのtable/entityにどのような処理を書いていくのがいいのでしょうか?
大変ざっくりとした質問で申し訳ないのですが、お時間のある方、
どうかご教授お願いいたします。
データベースにテーブルが3つあるとします。
tableA / tableB / tableC
tableA
id | uriage_kubun | value | date |
---|---|---|---|
1 | b | 3000 | 2017-01-02 |
2 | c | 1000 | 2017-02-03 |
3 | c | 1500 | 2017-03-04 |
4 | b | 1800 | 2017-04-07 |
5 | c | 500 | 2017-04-18 |
tableB
id | tableA_id | value | date |
---|---|---|---|
tableC
id | tableA_id | value | date |
---|---|---|---|
上記テーブルAにある各レコードに対して、
uriage_kubunの値がbの場合は、tableBに
uriage_kubunの値がcの場合は、tableCに
コピー(というかinsert)をバッチ処理のように実行したいのです。
根本的かつ基本的なCakePHP3の使い方の問題ですので、
「マニュアル読めよ!」という厳しいご指摘はわかるのですが、
そこをなんとか飲み込んでいただき、ご教授いただけないかと思います。
よろしくお願いたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
「それじゃフレームワークを使っている意味がないよ」という指摘を受けました。
データの操作に関わる部分を、生のSQLで書いていたり、MySQLにストアドプロシージャを書いて、
実行していたりしたためです。
この状況では、その指摘は気にしなくていいと思います。というのも、CakePHPなどのWebフレームワークは、基本的にデータ1件単位で扱うCRUD機能を便利に構築する、ということを主眼に作ってあって、データベースのバッチ処理向けというわけでは、必ずしもないからです。
DB-DBのデータ変換であれば、直接DB実行やストアドで実行のほうが向いている場合もあります(PHPで処理しようとすれば、最低限データの往復が必要となってしまいます)。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/04/22 22:48 編集
>CakePHPなどのWebフレームワークは、基本的にデータ1件単位で扱うCRUD機能を便利に構築する、ということを主眼に作ってあって
大変わかりやすい説明で、「なるほど」と納得がいきました。
その上でなのですが、今回の「意味ないよ」の方が、「railsやcakeではDBは直接触ることはせず、構成を書くときもmigrationを利用して、フレームワーク内で全て完結させるべきだよ」と指摘してくれました。
migrationの部分はもちろん納得なのですが、この指摘を厳密にとると「フレームワークではDBに直接何か書くようなことはするなよ。全部フレームワーク内で処理内容を参照できるようにしておけよ。」ということなのかな、と勝手に受け取っております。
話が回りくどくなってしまいましたが、フレームワークの作法として以下のように認識しておけばよろしいのでしょうか。
・全てフレームワークの中でかければそれに越したことはないのだが
・データの往復が発生してしまう処理を一度にストアドで実行できるのであればその限りではない
長々と本当にすみません・・・、あ、いや、ここで書いたこと、そのままmaisumakunさまが回答で書かれていますね。
もうベストアンサーでいいと思うのですが、もうちょっと他の方の回答を待ってみたいと思います。
本当にありがとうございました。
2017/04/22 22:53
2017/04/22 23:01
もしかしたら、こちらの内容についてまたコメントさせていただくかもしれませんが、
お時間がなければ無視していただいて結構です。
ありがとうございます!
2017/04/22 23:10
急ぎで拝読いたしました。
migrationファイルにストアドを書く方法はちょっとわからなかったのですが、
方法はあるという前提で、その他のサイトを調べさせていただきます。
課題も、モデルの使い方→migrationの書き方に変わったと思いますので、この点で新たに質問が発生した場合には新しく質問を立てさせていただこうと思います。
本当にありがとうございました。