第5章
第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
  1. 未完了だけ取る where を書く
  2. 新しい順に並べる
  3. get と first の違いを自分の言葉で1行ずつ書く