質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • CakePHP

    2610questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

  • Model

    98questions

    MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

cakePHP3のモデル(table/entity)の使い方(正しい作法?)について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,220

TomoKubota

score 51

これまで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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

「それじゃフレームワークを使っている意味がないよ」という指摘を受けました。 
データの操作に関わる部分を、生のSQLで書いていたり、MySQLにストアドプロシージャを書いて、 
実行していたりしたためです。 

この状況では、その指摘は気にしなくていいと思います。というのも、CakePHPなどのWebフレームワークは、基本的にデータ1件単位で扱うCRUD機能を便利に構築する、ということを主眼に作ってあって、データベースのバッチ処理向けというわけでは、必ずしもないからです。

DB-DBのデータ変換であれば、直接DB実行やストアドで実行のほうが向いている場合もあります(PHPで処理しようとすれば、最低限データの往復が必要となってしまいます)。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/22 22:48 編集

    maisumakunさま
    >CakePHPなどのWebフレームワークは、基本的にデータ1件単位で扱うCRUD機能を便利に構築する、ということを主眼に作ってあって
    大変わかりやすい説明で、「なるほど」と納得がいきました。
    その上でなのですが、今回の「意味ないよ」の方が、「railsやcakeではDBは直接触ることはせず、構成を書くときもmigrationを利用して、フレームワーク内で全て完結させるべきだよ」と指摘してくれました。
    migrationの部分はもちろん納得なのですが、この指摘を厳密にとると「フレームワークではDBに直接何か書くようなことはするなよ。全部フレームワーク内で処理内容を参照できるようにしておけよ。」ということなのかな、と勝手に受け取っております。
    話が回りくどくなってしまいましたが、フレームワークの作法として以下のように認識しておけばよろしいのでしょうか。
    ・全てフレームワークの中でかければそれに越したことはないのだが
    ・データの往復が発生してしまう処理を一度にストアドで実行できるのであればその限りではない

    長々と本当にすみません・・・、あ、いや、ここで書いたこと、そのままmaisumakunさまが回答で書かれていますね。
    もうベストアンサーでいいと思うのですが、もうちょっと他の方の回答を待ってみたいと思います。
    本当にありがとうございました。

    キャンセル

  • 2017/04/22 22:53

    直接DBを叩いてストアドを入れると、「ストアドがソース管理から抜け落ちる」という問題はありますが、マイグレーションに詰め込むこともできなくはないですので(http://qiita.com/macchaka/items/3decc5f48a15f00e188c ←こちらにあるように、任意のDDLを流すことも可能)、その問題は解消できます。

    キャンセル

  • 2017/04/22 23:01

    そうなんですね!早速読ませていただきます!
    もしかしたら、こちらの内容についてまたコメントさせていただくかもしれませんが、
    お時間がなければ無視していただいて結構です。
    ありがとうございます!

    キャンセル

  • 2017/04/22 23:10

    http://qiita.com/macchaka/items/3decc5f48a15f00e188c
    急ぎで拝読いたしました。
    migrationファイルにストアドを書く方法はちょっとわからなかったのですが、
    方法はあるという前提で、その他のサイトを調べさせていただきます。
    課題も、モデルの使い方→migrationの書き方に変わったと思いますので、この点で新たに質問が発生した場合には新しく質問を立てさせていただこうと思います。
    本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • CakePHP

    2610questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

  • Model

    98questions

    MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。