ASP.NET MVC の連載記事の関係から、他の MVC ものも抑えておかないと、と言いますか、CakePHP は抑えないと今日びの WEB ものはできないですよね~。かどうかは分かりませんが…
おととし CakePHP 祭りに行った頃から注目はしていたのですが、最初のチュートリアルをした後で止まっておりました。MVC 自体は色々と興味があるところなのですが、果たして PHP で実装をする側に立つことが今までなかったもので。
さて、ASP.NET MVC の場合は Model は、LINQ to Entities やら独自の Model やらを選べます。と言うのも、ひとつの画面にひとつのテーブルだけが表示される、ってことはほとんどないんですよね。
例えば、Amazon のトップページを例にとれば、
- 最近発売された商品の一覧
- あなたにおすすめの商品の一覧
- カテゴリ一覧
な感じで、いくつかのテーブルから検索結果を出します。
このようにする場合は、ASP.NET MVC の Model の場合には、
public class TopModel { // 最近発売された商品 public TNewGoods { get; set; } // おすすめ商品 public TYourGoods { get; set; } // カテゴリ一覧 public TCategories { get; set; } }
な感じで、3 つのテーブルを内部に持つ必要があるわけです。
これって、CakePHP でできるんだっけ? ってのが、いままでの私の疑問でありました。
CakePHP の Model って、ひとつのテーブルがバインドされている、という固定観念があったわけですね。
が、違います。当たり前だったのですが、CakePHP でも、複数のテーブルをモデルの含めることができます。モデルというか、コントローラーから複数のモデルをビューへ渡すことができます。
/controllers/goods_controller.php
<?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
<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 の方には結構大変なのかなぁと思ったり。