第5章 · 初心者向け
Model・データベース
データベースは「大きな表」。CakePHPでは Table と Entity に分けて扱います。
1. CakePHPのModelとは
Modelまわり=データの読み書きを担当する係
初心者はまず次の2つだけ覚えればOKです。
- Table … 表全体を操作(探す・保存する)
- Entity … 表の1行分(1件のデータ)
2. TableとEntity
たとえ
Excelでいうと、シート全体の操作が Table。1行が Entity です。
$todo->title; // 1件のタイトル
$todo->done; // 1件の完了フラグ
3. ControllerからModelを使う
$todosTable = $this->fetchTable('Todos');
// 以降 $this->Todos のように書ける環境もあります
「Todosという表係を借りる」イメージです。
4. find()
find()=検索スタートボタン$query = $this->Todos->find();
// まだ「条件付きの検索計画」。ここでDBは確定していないことも多い
5. all()
all()=ヒットしたものを全部(一覧として)取る$todos = $this->Todos->find()->all();
6. first()
first()=先頭の1件だけ。無ければ null$todo = $this->Todos->find()->first();
7. where() による検索条件
「未完了だけ」など、絞り込みです。
$todos = $this->Todos->find()
->where(['done' => false])
->all();
読み方
where(['done' => false])=「done が false のもの」。
8. AND / OR条件
- 条件を並べる → AND(どれも満たす)
ORキー → どれか満たせばOK
->where([
'user_id' => 1,
'done' => false, // どちらも必要 = AND
])
->where([
'OR' => [
['title LIKE' => '%請求%'],
['title LIKE' => '%支払%'],
]
])
9. 並び替え
->orderBy(['created' => 'DESC']) // 新しい順
// DESC=大きい→小さい、ASC=小さい→大きい
10. データ1件取得
$todo = $this->Todos->get($id);
// ID指定で1件。無いとエラー(例外)になる
first との違い
get は「必ずあるはず」のとき。first は「無いかも」のときに向きます。
11. データ一覧取得
$todos = $this->Todos->find()
->where(['user_id' => $userId])
->orderBy(['id' => 'DESC'])
->all();
$this->set(compact('todos'));
// compact は ['todos' => $todos] の短縮
12. SQLがどう組み立てられるのか
あなたが書いた find は、最終的にデータベース言葉(SQL)になります。
SELECT * FROM todos WHERE done = 0
実務の癖
「思ったデータが来ない」ときは、画面より先にSQLを疑うと早いです。
第5章 やってみよう
EXERCISE
- 未完了だけ取る where を書く
- 新しい順に並べる
- get と first の違いを自分の言葉で1行ずつ書く