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

こちらも丁度、
学んでいて感謝(´・ω・)ス
ちとzendと悩むけど(´・ω・)ゞ
私のほうは zend を知らないので、CakePHP 張りでw
smarty とか、その他諸々の PHP の方には結構大変なのかなぁと思ったり。