web学習日記

プログラミングやweb関係を学んだことを呟くブログ

CRUDとは

f:id:nana205:20190711014353p:plain

CRUDとは

CRUDは Create(作成) Read(参照) Update(更新) Delete(削除)の頭文字をとって命名されたデータベース操作の種類のことで
データベース操作の基本です。

テーブルを作成してみる

create table users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
age INTEGER,
created_at DATETIME,
updated_at DATETIME);`

create tableの基本文法は

create table [ユーザ名] ( [カラム名1] [型1] [オプション1],[カラム名2] [型2] [オプション2] ...)

Create /INSERTでレコードを作成する

テーブルが作成できたので実際にレコードを作成します。作成するにはInsert文で作成します。

INSERT INTO users (name, email, age, created_at, updated_at)
VALUES('John', 'john@example.com', 20, NOW(), NOW())

このような形式で挿入するテーブル、カラムとその値を指定してレコードを挿入します。 複数カラムを入れたい場合

INSERT INTO users (name, email, age, created_at, updated_at)
VALUES('Mary', 'mary@example.com', 20, NOW(), NOW()),
('Sam', 'sam@example.com', 22, NOW(), NOW()),
('Brian', 'brian@example.com', 30, NOW(), NOW()),

また、次のようにnameを指定しない形でのINSERT文もSQLの構文としては正しいですが、
前の段階でnameカラム自体にNOT NULL(空でない)制約をかけているのでnameを省略するとエラーになります。

> INSERT INTO users ( email, age, created_at, updated_at)
-> VALUES('alice@example.com', 20, NOW(), NOW());
ERROR 1364 (HY000): Field 'name' doesn't have a default value

ここでは、NOTNULL制約をかけているのでデフォルトの値がないと言われています。

Read/SELECTでレコードを参照する

前で作成したので確認してみる

SELECT*FROM users;

ここで条件を絞り込むにはwhere句を使用します。

SELECT*FROM users where name = 'masato';

名前にmが含まれている場合

SELECT*FROM users where name like '%m%';

名前にmが含まれるかつ20際以上の人

SELECT*FROM users where name like '%m%' and age>=20;

名前に"m"が含まれるか"s"が含まれる人

SELECT*FROM users wehere name like '%m%' or name like '%s%';

など様々な形で条件式を書くことができます。AND条件OR条件を設定することができます。

Update/UPDATEでレコードを更新

次は更新処理です。masatoの名前をxxxという形式で更新しています。

UPDATE users SET name ='xxxx' where name ='masato';

更新日も設定すると

UPDATE users SET name = 'XXXX', updated_at = NOW() where name = 'masato';

このように複数のカラムを更新することができます。 UPDATEはSQLで迂闊にWHERE句を忘れるとテーブル全て更新されてしまいます。

Delete/DELETEでのレコード削除

最後のDELETEはいたってシンプルです

DELETE FROM users;

これだとテーブルの全レコードを削除してしまうのでUPDATEと同様に条件を絞って削除します。

DELETE *FROM users where  age>=20;

まとめ

CRUD操作のおさらいをしました。フレームワークありきだと直接SQLを操作しないため書く機会が減ってしまいますが、
このように整理してみると基本が振り返れていいですね。

CakePHPのMVCとは何か?

f:id:nana205:20190614011943j:plain

CakePHPに限らず多くのフレームワークMVCモデルを採用しています。
ただなぜMVCを採用しているのでしょうか? MVCの利点と問題点,CakePHPMVCの特徴と整理しておきます。

そもそもMVCとは?

アプリケーションアーキテクチャの一つで
Model/View/COntrollerの3つのプログラム構造のことを言います。

f:id:nana205:20190711005552p:plain

それぞれの役割

M:Model

  • システムの中でビジネスロジックの実行 DBへアクセスするためのもの

  • アプリケーションが扱うデーターの操作

  • 業務屋

V:View

  • ユーザーからの画面入力

  • ユーザーへの結果を出力

  • Modelのデータの状態を参照して画面に表示

  • レンダリング

C:Controller

  • 入力情報を受け取る

  • 処理を行うModelと結果を返すViewを選定

  • 司令塔の役割

利点

1.機能が分割されているため、分業して作業がしやすい。
2.それぞれが独立しているので変更・修正があった場合影響が受けにくい

問題点

1.業務で扱うデータ要件が複雑になればなるほど、Modelが肥大化する
2.入力に応じた出力要件が複雑になればなるほど、ControllerとViewの依存が高まる

CakePHPMVCの特徴

CakePHPMVCの特徴としてModelには EntityとTableがあります。

Entity

Table内のソースを動かすために必要なもの。投げれば計算とか、Selectしてきた結果のフラグを日本語に変えたりしてくれます。
個々のレコード行レコードレベルの振る舞いや機能設定の定義 レコードの部分にあたるところ

Table

CRUD処理はもちろん、入力チェックもここで実装できます。

CakePHPは(デフォルトでやろうとすると)1テーブル1ヴァリデーターになります。 もちろん、デフォルトでやろうとしないでヴァリデーターかけることはできます。

Tableを動かすためにはEntityが必要です。 TableのinitializeでどのEntityを使用するか定義します。 initializeではEntity以外に、使用するDB名とテーブル名の定義、主キーの定義をします。

Element

こちらはHTMLファイルをパーツごとに書き出すことがきます。
ここで書き出したパーツはTemplateから呼び出して同じパーツで使いまわすことができます。

Layout

全画面共通で表示させたいことをdefualt.ctpに表示させる 個別で適用させることも可能

CakePHPの規約について

f:id:nana205:20190614011943j:plain

なぜ規約があるのか?

CakePHPの公式にも書いてある通り「設定より規約」の仕様になっているからです。
これはもともとRuby on Railsの手法をCakePHPが取り入れたからです。Ruby on Railsも「設定より規約」を元にしています。 規約をすることで開発を統一することができるので、自分以外の開発者がいてもするにプロジェクトに参加できます。 また、自己流で書いたコードは非常に読みずらく、コードの保守性に問題が出るからです。 フレームワークは使い始めは覚えることが多いですが、一度覚えれば簡単にそして圧倒的に時間を短縮させることができます。

CakePHPには規約の命名規則があります。

キャメルケース記法

こちらは2パターンあります。
1.パスカルケース
AritcleController.phpなど 単語の先頭大文字で表記する

2.キャメルケース
articlePage.phpなど
最初の単語だけは小文字それ以降は大文字表記

アンダーコア記法

スネークケース、単語の間にアンダースコアを入れる
article_page

CakePHP命名規約は?

View

コントローラーの関数名をアンダースコア記法にしたものが表示させる
ex.ArticleController article.ctpを表示
ex.editName()関数、edit_name.ctpなど表示する

コントローラー

複数形+パスカルケース+Controllerとなります。

ex.PlayMessageController
ex.UsersController

モデル (table entity)規約

Tableクラスは命名は複数形+パスカルケース+tableになります。 ex.PlayMessageTable
ex.UsersTable

ただし、Entityクラスは単数形になるので注意が必要です。
Userなど

データベースの規約

CakePHPはデータベーステーブルとModelが関連ずけられているのですが、テーブル名は複数形+アンダースコアになります。 ex.playing_message
フィールドやカラム名についてもアンダースコア表記になります。