CakePHPの入門書では、めったにお目にかかれない複数テーブルの扱い方。
CakePHPではORマッピングすることで、開発者は極力自分でSQL文を書かなくていい。最初は疑わしかったが、メソドロジーを見ていると、とりあえずいわれたとおりやろう、という気になる。
蛇足だが、フレームワークなどを使う時に、あまり理解しないまま自分のわがままや思い込みで「使えない」といわないほうがいい。フレームワークを作れる能力をもっている人間は、私やあなたよりはよほど経験値が高いのだから。日本人はモノを作らないで評論ばかりしているから、モノを作る大切さ、能力を過小評価しているように思えてならない。一度は、謙虚になってすべてを受け入れよう。
さて、複数のテーブルの間には次の3つの関係がありえる。
・1対1
・1対多
・多対多
最初のふたつができればよく、3つ目は関係専用のテーブルを作る必要があるのは、データベース設計のイロハですわね。
ここで本(book),作者(author)を例にとると、モデルは次のとおり。
<?php
class Author extends AppModel{
var $name = 'Author';
var $hasMany = 'Book';
}
?>
当然だが、このモデルが参照される時には、Authorテーブルが参照される。その中に、book_idというフィールドがあれば、cakePHPは自動的に、Bookテーブルを同時に検索してくれる。$hasManyが検索方法を表す、と考えたほうがわかりやすい。
そして、Bookは
<?php
class Book extends AppModel{
var $name =? 'Book';
var $belongsTo = 'Author';
?>
$bolongsToに書かれたテーブルを自分のBooksテーブルにauthor_idというフィールドがあれば、それのnameフィールドで置換してくれる。(フィールド名がnameか、titleであることが命名規約)つまり、(belongToオブジェクト)_(キー)を書くと自動的にauthorテーブルをidで検索してくれる。
例えば、コントローラを次のように作ってみる。
<?php
class BooksController extends AppController{
var $name = 'Books';
var $scaffold;
}
?>
すると、Booksテーブルのメンテナンスアプリが表示されちまう。おそるべし、CakePHP!
$scafford;は強力なテストが可能だ。なぜならば、モデルが正しければ標準的なテーブルメンテナンスアプリケーションが表示される。
私には完全に理解できていないが、今のところcakePHPとは、$scaffordのデフォルトを以下のようにしてモディファイしていっているように思える。
<?php
class Books expands AppController{
var $name = 'Books';
function index(){
$this->Book->recursive = 1;
$books = $this->Book->findall();
$this->set('books', $books);
}
}
?>
recursiveはフラグで、関係している先のデータも暗黙のうちに拾ってくることを示す。
ごちゃごちゃ書くより、Viewで次のようにAuthorデータを記述できる。
コントローラーにメソッドを書いたので、Viewも必要。views/books/index.ctp。
<table>
<thead>
<th>ISBN</th><th>Title</th><th>Author</th>
</thead>
<?php foreach($books as $book):?>
<tr>
<td><?php echo $book['Book']['isbn'] ?></td>
<td><?php echo $book['Book']['title'] ?></td>
<td><?php echo $book['Author']['name'] ?></td>
</tr>
<?php endforeach; ?>
</table>
自動的に関係しているAuthorのデータを記述できる!
今日はここまで。