- 締切済み
cakePHPのモデルについて
cakePHPのモデルについて 今までずっとPHP+smartyでやってきました。 今回はじめてcakePHPを使ってみたのですが、 私はモデルというものがとても使いにくいように感じました。 バリデーションは便利だと思いますが。 (ちなみにまだcakePHPを使い始めて2日目です。) 今までずっとデータの抽出はSQL文を書いており、 find関数の引数にwhere句の条件等をするのはとてもめんどくさいと感じています。 参考までにモデルについて、いい所と悪い所を聞きたいと思います。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- hogehoge78
- ベストアンサー率80% (433/539)
あ、すみません。 後は、CakePHPのコード規約に則ることで、複数人でプロジェクトを回すときにコードが分かりやすくなるとか、そういったメリットも有りましたね。 >この形が使いやすいとも思わないし(Model名って所がめんどくさい…)、自分でラッパー関数等を作った方がOUTPUTを使いやすい形になると思いました。 これは多少冗長でも、Modelから例えばControllerだとか、Componentだとか、Viewだとかで扱うときに便利な場合もあります。 結局CakePHP内では使いやすくなるように設計されているはずですので、そこは慣れかなぁと思います。 第三者が作成したプラグインだとか、上記のComponentだとか、なんかしらのCakePHP用のライブラリを使用する場合にもそのようにOUTPUTされるのが前提だったりすると思いますし。 ■queryメソッドを叩くとか、そこらへんのこと まぁ、最終的によく使う記述なんかは、Modelにメソッド追加して、必要パラメータだけ渡せば値が返ってくるようにするのだし、どっちでもいいんじゃないかって気はします。 <?php class Hoge extends AppModel{ function findExtra($value){ return $this->find('all', array('Name ='=>$value)); } //と書くのか、それとも function findExtra2($value){ //queryの使い方はあまり憶えてないので適当ですが return $this->query("SELECT * FROM hoge WHERE name = ?", $value); } //と書くのか } ?> 結局、Modelで引っ張り出してきたデータがCakePHPで扱いやすい形式の配列でControllerに正しく帰ってきてくれれば良いのではないかなと。(メンテナンスしやすければOK) CakePHPは、このModelでのデータベースアクセスをとっぱらっても、Webアプリを作るのに非常に便利なノウハウが詰まっていますので、Modelが使いづらいから、という理由で利用を断念するのではなく、 もうすこし、色々いじってみては如何でしょうか。(Viewのヘルパーなんかは便利なものが結構あったりします) どうしても馴染めない、といった場合でも知識として奪える部分も沢山あるので。 (cakeだけとは言わず他のフレームワークもしかり。)
- hogehoge78
- ベストアンサー率80% (433/539)
例えば、データベースを、MySQLを基本にして書いてたとして、 それをPostgreSQLに変更することになった場合、SQL文を直接書くと若干違った記述になったりするのですが、 findメソッドを使えば、SQL文は、内部でそれぞれのドライバが勝手に書いてくれるので(抽象化ってやつです)変更に強いです。 ※まぁデータベースが変更するようなことが起こりえない場合には確かに煩わしいかもしれませんが。 後は、CakePHPが(CakePHP以外でもDoctrineなどのORマッパーとかもそうですけど)生成するSQL文は、フレームワークやライブラリ自身が使いやすいように整形されたものです。 整形されているから、findメソッドが返してくる値は、$data['Model名']['フィールド名']というように帰ってきます。 他にも、テーブルが他のデータと関連している場合に、 例えば、Userテーブルがあったとして、ユーザはそれぞれGroupIDを持っていて、Groupテーブルと関連している場合などは、Modelのメンバ変数にその旨を記述しておけば、find関数でユーザ名を引っ張った時に自動的にGroup名とかの情報も付加してくれたりします。 私がぱっと思いつくメリットはここらへんです。 ちなみに、直接クエリを叩きたければ、queryメソッドあたりで投げることができたと思います。(詳しくは「CakePHP 直接 クエリ」とかググッてみてください) また、それも嫌だといった場合は、 Modelのメンバ変数で、 「var $useTable = false;」 と記述して、適当にPDOなり、mysql_connectなり自分で実装してしまっても良いかと思います。(あんまり良いノウハウとは言えず、むしろバッドノウハウとは思いますが。) 最後に、MVCは、Controllerで単純な振り分け処理、ViewでHTMLなどを表示、そしてModelで「演算処理」を行うよう分ける、というパターンであって、Modelはデータベースにアクセスしてごにょごにょする為だけのものではないです。 ですので、テーブルへのアクセス、というくくりでメリットやデメリットを考えないほうが良いかと思います。
お礼
ご回答ありがとうございます。 ご意見を参考にし、検討した結果、私には合ってないように思ったので、 今回はcakePHPは使わない事に決めました。 以下がその理由です。 >findメソッドを使えば、SQL文は、内部でそれぞれのドライバが勝手に書いてくれるので(抽象化ってやつです)変更に強いです。 >※まぁデータベースが変更するようなことが起こりえない場合には確かに煩わしいかもしれませんが。 DBを変更する事が基本的に変える事がないので、特に必要ないですね。。 ただ今回のページが終わった後、別のページをやった時にMySQLではなくPostgreSQLって時は便利そうですね。 ただ、その場合postgreの構文を覚えるかcakePHPのIFを覚えるかになってくるのかな。。 どっちがいいかっていうと前者でも別にいい気もしますが。。 >後は、CakePHPが(CakePHP以外でもDoctrineなどのORマッパーとかもそうですけど)生成するSQL文は、フレームワークやライブラリ自身が使いやすいように整形されたものです。 >整形されているから、findメソッドが返してくる値は、$data['Model名']['フィールド名']というように帰ってきます。 この形が使いやすいとも思わないし(Model名って所がめんどくさい…)、自分でラッパー関数等を作った方がOUTPUTを使いやすい形になると思いました。 >他にも、テーブルが他のデータと関連している場合に、 >例えば、Userテーブルがあったとして、ユーザはそれぞれGroupIDを持っていて、Groupテーブルと関連している場合などは、Modelのメンバ変数にその旨を記述しておけば、find関数でユーザ名を引っ張った時に自動的にGroup名とかの情報も付加してくれたりします。 この辺はSQL文でやっちゃっても簡単な気がするのでSQL文でやる事にします。 >ちなみに、直接クエリを叩きたければ、queryメソッドあたりで投げることができたと思います。(詳しくは「CakePHP 直接 クエリ」とかググッてみてください) これをやるとなんか中途半端な気がするのでなんかなーと思いました。。 >最後に、MVCは、Controllerで単純な振り分け処理、ViewでHTMLなどを表示、そしてModelで「演算処理」を行うよう分ける、というパターンであって、Modelはデータベースにアクセスしてごにょごにょする為だけのものではないです。 >ですので、テーブルへのアクセス、というくくりでメリットやデメリットを考えないほうが良いかと思います。 なるほどー、書籍読んだ限りテーブルのアクセスについてが書かれてる事が多かったので勘違いしてました! ちょっと批判的な意見が多くなってしまいましたが、とても参考になりました。 その後、ORマッパーという単語も調べてそれなりに色々わかってきました。 ありがとうございました!