【CakePHP3】データベースの削除、参照【新人がyoutube動画でPHP学習part4】

# １．はじめに

今回はデータベースの基本操作であるCRUDのうち、Deleteにあたる削除、Readにあたる読み出し（参照）を行います。
教材はチャンスラボ株式会社の公式YouTubeチャンネル。
https://www.youtube.com/@asterisk_cl_lab/videos

第８回～第９回の動画を参考にします。

【第８回　データ削除してみよう！】
https://www.youtube.com/watch?v=VmZMgZ71VHU

【第９回　データ参照してみよう！】
https://www.youtube.com/watch?v=Rurv1dZnXG4

# ２．目次

１．はじめに
２．目次
３．データ削除してみよう！
４．データ参照してみよう！
５．終わりに

# ３．【第８回　データ削除してみよう！】
CRUDのD＝Deleteについて、データ削除を行いながら解説しています。

**２：２０～３：２７**
物理削除と論理削除について解説しています。

〇物理削除・・・DBからデータを完全に削除する。
〇論理削除・・・データが削除されたような振る舞いをする。

論理削除は実際データ削除していないなら、DeleteというよりUpdateでは？と思ったので少し調べてみました。どうやらSQL的には物理削除はDeleteで、論理削除はUpdateのようです。

また論理削除を扱う場合、データがDBに残ることになるので、データ取得時に論理削除されたものを誤って取得しないよう削除フラグに注意しないといけないという点があるようです。
そういった煩わしさを解消するのが、**３：３０～**で触れられているCakePHP-soft-deleteプラグインなのでしょう。

**４：２７～４：４２**
aタグのonclick属性について触れています。
コードや関数を記述することでJavaScriptを実行できるんですね。覚えておきます。
![スクリーンショット 2023-04-06 102826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/685a5579-1800-e5ce-20bd-6b38fc56b6fe.png)

**５：０４～５：４５**
FormHelperのpostLinkメソッドについて解説しています。
confirmで確認用のダイアログを指定しているようですね。
![スクリーンショット 2023-04-06 105617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/3482cda0-bd5c-2fdf-db8b-bc03d51b8a9f.png)
参考：cookbook　https://book.cakephp.org/3/ja/views/helpers/form.html

# ４．【第９回　データ参照してみよう！】
CRUDのD＝Readについて、データ参照を行いながら解説しています。

**４：１０～５：１０**
paginateメソッドについて解説しています。
cookbookにlimit以外のオプションが記載されているということなので、一応見ておきました。
![スクリーンショット 2023-04-06 153152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/fef02345-0392-747d-456b-554254fc23cd.png)
参考：cookbook　https://book.cakephp.org/3/ja/controllers/components/pagination.html

**５：５０～５：５８**
index.ctpの３２行目から４９行目のforeachに触れています。
UsersTableから持ってきたレコードをHTMLの\<tr>に渡す処理をループさせているので、HTMLコードを何度も書かずにユーザー一覧が作成され、楽に済むということですよね。
![スクリーンショット 2023-04-06 162759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/eafc1e80-04a2-c1b0-5fde-4cab07a81eea.png)

**５：５９～６：０４**
入力文字のエスケープについて触れています。

>脆弱性防止の観点からエスケープ処理が必須となるのは、外部からウェブアプリケーションに渡される「入力値」の文字列や、データベースやファイルから読み込んだ文字列、その他、何らかの文字列を演算によって生成した文字列等です。しかし、必須であるか不必要であるかによらず、テキストとして出力するすべてに対してエスケープ処理を施すよう、一貫したコーディングをすることで、対策漏れ（脚注3）を防止することができます。
参考：IPA情報処理推進機構　https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html

エスケープ処理は大事なようですね。
ちなみにh()とはCakePHPの関数です。

>h(string \\$text, boolean \\$double = true, string $charset = null)
htmlspecialchars() の便利なラッパー。
参考：cookbook　https://book.cakephp.org/3/ja/core-libraries/global-constants-and-functions.html

さらにさらにhtmlspecialchars() とはPHPの関数で、エスケープするための関数のようです。

>文字の中には HTML において特殊な意味を持つものがあり、 それらの本来の値を表示したければ HTML の表現形式に変換してやらなければなりません。 この関数は、これらの変換を行った結果の文字列を返します。 入力文字列の中で名前付きエンティティに関連づけられたものを すべて変換する必要がある場合には、代わりに htmlentities() を使用してください。
参考：PHPマニュアル　https://www.php.net/manual/ja/function.htmlspecialchars.php

**６：１８～６：３６**
HtmlHelperについて触れています。index.ctpの４４、４５行目のコードの左側がFromではなくHtmlになっており、Linkメソッドを呼び出していますね。
![スクリーンショット 2023-04-06 161341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/6ba2bc0c-bb9b-f455-31e6-8596c64b16ac.png)
参考：cookbook　https://book.cakephp.org/3/ja/views/helpers/html.html#id9

**７：１０～７：４３**
詳細画面とViewメソッドについて説明しています。
コードを見るとgetメソッドでUsersテーブルから１レコード分取り出して、setメソッドでControllerへデータを渡して詳細画面に表示させている、という流れが分かります。
ただ説明にある「ユーザーエンティティオブジェクト」について、いまいち理解できなくて具体的に考えていくと頭が混乱します。
![スクリーンショット 2023-04-07 103039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297208/a02e60e7-9dff-9cf9-5524-725fac35abed.png)


# ５．終わりに
動画を見ていて詳しく調べたくなった時、どういった調べ方をすればいいか若干分かってきたので、参考にしたリンクを都度貼ってみました。調べた結果理解できないということもまだ多いですが、習慣にしていきたいと思います。
最後までご覧いただきありがとうございます！