ASP.NET MVC の連載記事の関係から、他の MVC ものも抑えておかないと、と言いますか、CakePHP は抑えないと今日びの WEB ものはできないですよね~。かどうかは分かりませんが…
おととし CakePHP 祭りに行った頃から注目はしていたのですが、最初のチュートリアルをした後で止まっておりました。MVC 自体は色々と興味があるところなのですが、果たして PHP で実装をする側に立つことが今までなかったもので。
さて、ASP.NET MVC の場合は Model は、LINQ to Entities やら独自の Model やらを選べます。と言うのも、ひとつの画面にひとつのテーブルだけが表示される、ってことはほとんどないんですよね。
例えば、Amazon のトップページを例にとれば、
- 最近発売された商品の一覧
- あなたにおすすめの商品の一覧
- カテゴリ一覧
な感じで、いくつかのテーブルから検索結果を出します。
このようにする場合は、ASP.NET MVC の Model の場合には、
1 2 3 4 5 6 7 8 9 | public class TopModel { // 最近発売された商品 public TNewGoods { get; set; } // おすすめ商品 public TYourGoods { get; set; } // カテゴリ一覧 public TCategories { get; set; } } |
な感じで、3 つのテーブルを内部に持つ必要があるわけです。
これって、CakePHP でできるんだっけ? ってのが、いままでの私の疑問でありました。
CakePHP の Model って、ひとつのテーブルがバインドされている、という固定観念があったわけですね。
が、違います。当たり前だったのですが、CakePHP でも、複数のテーブルをモデルの含めることができます。モデルというか、コントローラーから複数のモデルをビューへ渡すことができます。
/controllers/goods_controller.php
1 2 3 4 5 6 7 8 9 10 11 12 | <?php class GoodsController extends AppController { var $name = 'Goods' ; var $uses = array ( 'NewGood' , 'YourGood' , 'Category' ); function index() { $this ->set( 'NewGoods' , $this ->NewGood->find( 'all' )); $this ->set( 'YourGoods' , $this ->YourGood->find( 'all' )); $this ->set( 'Categories' , $this ->Category->find( 'all' )); } } ?> |
のように作成しておくと、
http://servername/goods
で次のような画面が表示できます
この時のビューは次な感じ。
/views/goods/index.ctp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | < h1 >NewGoods</ h1 > < table > < tr > < th >Id</ th > < th >name</ th > < th >price</ th > </ tr > </ p > < p > <? php foreach ($NewGoods as $item): ?> < tr > < td ><? php echo $item['NewGood']['id']; ?></ td > < td ><? php echo $item['NewGood']['name']; ?></ td > < td ><? php echo $item['NewGood']['price']; ?></ td > </ tr > <? php endforeach; ?> </ table > </ p > < p > < hr /> < h1 >YourGoods</ h1 > </ p > < p > < table > < tr > < th >Id</ th > < th >name</ th > </ tr > </ p > < p > <? php foreach ($YourGoods as $item): ?> < tr > < td ><? php echo $item['YourGood']['id']; ?></ td > < td ><? php echo $item['YourGood']['name']; ?></ td > </ tr > <? php endforeach; ?> </ table > < hr /> </ p > < p > < h1 >Categories</ h1 > < table > < tr > < th >Id</ th > < th >name</ th > </ tr > </ p > < p > <? php foreach ($Categories as $item): ?> < tr > < td ><? php echo $item['Category']['id']; ?></ td > < td ><? php echo $item['Category']['name']; ?></ td > </ tr > <? php endforeach; ?> </ table > |
複数の Model(NewGoods,YourGoods,Categories)を、コントローラー GoodsController でひとまとめにして、ビューで表示させるという方式です。
ASP.NET MVC の場合は、View に対してひとつの Model しか引き渡せないので、このあたりの動きが違います。逆に言えば、CakePHP の場合は、ひとつの Model にひとつのテーブル(あるいは複数のテーブルのクエリ結果)を渡すことになるので、このあたりが「違い」ますね。
こちらも丁度、
学んでいて感謝(´・ω・)ス
ちとzendと悩むけど(´・ω・)ゞ
私のほうは zend を知らないので、CakePHP 張りでw
smarty とか、その他諸々の PHP の方には結構大変なのかなぁと思ったり。