第6章
第6章 · 初心者向け

CRUD

データの基本は4つだけ。作る・読む・更新・削除です。

1. CRUDとは

Create 作る / Read 読む / Update 更新 / Delete 削除

TODOアプリも会員管理も、ほとんどこの組み合わせです。

2. 一覧表示(Read)

public function index()
{
    $todos = $this->Todos->find()->all();
    $this->set(compact('todos'));
}

「全部取って画面へ渡す」だけのシンプルな形です。

3. 詳細表示(Read)

public function view($id = null)
{
    $todo = $this->Todos->get($id);
    $this->set(compact('todo'));
}

4. 新規登録(Create)

流れ(暗記用)
  1. 空のEntityを用意
  2. POSTなら入力を流し込む
  3. save できたら Flash+一覧へ
  4. 失敗ならエラー表示
public function add()
{
    $todo = $this->Todos->newEmptyEntity();
    if ($this->request->is('post')) {
        $todo = $this->Todos->patchEntity($todo, $this->request->getData());
        if ($this->Todos->save($todo)) {
            $this->Flash->success('登録しました');
            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error('登録に失敗しました');
    }
    $this->set(compact('todo'));
}

5. Entityの作成

$todo = $this->Todos->newEmptyEntity();           // 空
$todo = $this->Todos->newEntity(['title' => '原稿']); // 最初から値あり

6. patchEntity()

フォームの入力をEntityに貼り付け+チェック(バリデーション)
$todo = $this->Todos->patchEntity($todo, $this->request->getData());

7. save()

DBに保存。成功したらデータ、失敗したら false
if ($this->Todos->save($todo)) {
    // 成功
}

8. 更新(Update)

新規との違いは「先に既存データを get する」ことです。

public function edit($id = null)
{
    $todo = $this->Todos->get($id);
    if ($this->request->is(['post', 'put', 'patch'])) {
        $todo = $this->Todos->patchEntity($todo, $this->request->getData());
        if ($this->Todos->save($todo)) {
            $this->Flash->success('更新しました');
            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error('更新に失敗しました');
    }
    $this->set(compact('todo'));
}

9. 削除(Delete)

public function delete($id = null)
{
    $this->request->allowMethod(['post', 'delete']);
    $todo = $this->Todos->get($id);
    if ($this->Todos->delete($todo)) {
        $this->Flash->success('削除しました');
    } else {
        $this->Flash->error('削除に失敗しました');
    }
    return $this->redirect(['action' => 'index']);
}
なぜ allowMethod?

URLを直接開いただけ(GET)で消えないようにする安全策です。

10. バリデーション

入力ルール。「タイトル必須」などをTableに書く
public function validationDefault(Validator $validator): Validator
{
    $validator
        ->scalar('title')
        ->maxLength('title', 100)
        ->notEmptyString('title');
    return $validator;
}

第6章 CRUD総合演習

EXERCISE
  1. index / view / add / edit / delete の骨格を写経する
  2. title 必須バリデーションを入れる
  3. 成功・失敗で Flash を出し分ける