Friction River Software

  • お問い合わせ

CakePHP5入門【CakePHP5基礎編⑤】データベース操作①

B美

今回は「データベース操作」について説明していきます

C菜

MVC」におけるModelモデルのクラスを使うんですかぁ~?

B美

その方法がメインになるわね

A子

ん?
わざわざ「メイン」と言うってことは、Modelモデルを使わない方法もあるの?

B美

直接SQL文を実行するって方法もあるのよ

まぁ、あまりお勧めはしないけどね

A子

何か問題でもあるの?

B美

一つはSQL文の知識が必要だってことね
(言い換えれば、SQLに詳しい人はこっちのほうが簡単かもしれないけど…)

で、もう一つの理由は、ページネーションとの連携が難しくなるってことかな

C菜

ページネーション」って何ですか~?

B美

検索結果が大量にある場合、(1ページに表示する件数を絞って)複数ページにまたがるように表示していく機能のことよ
(Googleの検索結果をイメージしてもらえば良いわ)

A子

それってなんだか難しそうなんだけど…

B美

結構難しいわよ(というか面倒くさい)

ところが!
(CakePHPの機能である)「$this->paginate」メソッドを使うとあら不思議、めっちゃ簡単に「ページネーション」を実現できるのよ

C菜

ということは「ページネーション」が必要な場合、SQL文の直接実行はやらないほうが良いってことですね~?

B美

そういうこと
まぁ、私の個人的な見解としては、SQL文を直接叩くほうが楽なんだけどねー(苦笑)

さて、前置きはここまでとして、さっそく授業を始めましょう
まずはテストデータを作りたいから、以前作った「testdb.sql」を開きます

B美

その中の最終行だけを残して、上の部分を全て削除します

で、その行(insert文)をコピーして、下記のように入力したあと、「insert.sql」というファイル名で保存してね
(「values (」の次の数値は「主キー」だから、その値が重複しないように注意すること)

C菜

できました~

B美

んじゃ「MATE端末」を開いてから以下のように入力してね

mysql -u root -p testdb < insert.sql[Enter]

(MariaDBの)rootパスワードを入力すれば完了よ

A子

MATE端末」で

mysql -u root -p testdb[Enter]

を打ち込んだあと、

select * from counters;[Enter]

を実行してみたよ

B美

以前の授業でやった知識が身についているようで嬉しいわ(感心、感心)

それじゃ、次は新しいControllerコントローラーを作りましょう

cd html/testapp[Enter]
bin/cake bake controller Counters[Enter]

を実行してね

これにより「testapp/src/Controller」の中に「CountersController.php」が自動生成されるわ

B美

続けてViewビューファイルも作りましょう

bin/cake bake template Counters[Enter]

を打ち込みます

めっちゃエラーみたいなやつが出るけど気にしないように(苦笑)
作業用テンポラリーファイルの所有者オーナーがWebサーバ(www-data)になっていて、そのファイルに対する書き込み権限が無いせいで警告が表示されているだけだから…



C菜

「testapp/templates」を見てみるです~

Counters」ディレクトリがあって、その中に4つのファイルができてますよ~



A子

これってブラウザから「localhost/testapp/Counters」でアクセスできるんだよね?

B美

それでも良いんだけど、「localhost/testapp/counters」でもOKよ

実は前回のPostTestについても「localhost/testapp/PostTest」(パスカルケース)のほかに、「localhost/testapp/postTest」(キャメルケース)や「localhost/testapp/post-test」(ケバブケース)というURLも許可されてるのよね
(まぁ、あまり気にしなくても良いんだけど…)

A子

ケバブって、あの肉料理の…?(笑)

そんなことはともかく、何よこの画面…
まだ何もしてないってのに、めっちゃ機能が充実してるんだけど…

C菜

すごいです~

NEW COUNTER」とか「View」「Edit」「Delete」とかありますよ~
(「Delete」だけは実際の削除についてはキャンセルしましたけど~)

B美

その4つを総称して「CRUDクラッド」と呼びます

Create
Read
Update
Delete

の頭文字を並べたものね

A子

コマンドを叩いただけなのに…

あ、でも「bake model」と「bake controller」と「bake template」を順に実行するのは少し面倒ね

B美

全て一括して実行することもできるのよね(実は…)

つまり…
もしもデータベーステーブルが「○○」という名前だったら

bin/cake bake all ○○[Enter]

で、「MVC」全てを一度に作成できるってわけ

C菜

CountersController.php」の中身を確認してみたんですけど~

「PostTestController.php」のときに記述した「initialize」メソッドや「$Counters」フィールドが無かったですよ~?

B美

お、いいところに気が付いたわね

Modelモデルのクラス名とControllerコントローラー名の前半が揃っている場合、「fetchTable」メソッドは不要なのよ
(逆に、そうでない場合には「fetchTable」メソッドの実行が必要だってことなんだけど…)

A子

それら全てをWebフレームワークがうまいことやってくれてる…ってことなのかー

まじですごいと思うわ

B美

でしょ?(ドヤ顔)

それでは、その「CountersController.php」を開いてみて

B美

これって自動生成されたコードなんだけど、「index」メソッドの内容を簡単に説明するわね

一行目は今から「counters」テーブルを検索するわよー…って意味ね
二行目は「ページネーション」を適用します…ってこと
三行目は「ページネーション」済みの検索結果をViewビューへ受け渡すって意味になるわ

なお、compact()を使うと、その変数名をViewビュー側でも使えるってだけの話
具体的には

$this->set(compact('counters'));



$this->set('counters', $counters);

と同じ意味よ

C菜

検索条件を指定していないから、全てのレコードが表示されたんでしょうか~?

B美

その通り!
つまり、ここで細かい条件を指定することもできるってわけ

次回はそのあたりを学んでいきましょう
まぁ、いくつかのパターンをマスターすれば良いだけだから、そんなに難しくないと思うけどね

A子

ほんとかな?
B美の「難しくない」はあてにならないんだよね(苦笑)

あ、そういえば「ページネーション」が働いてないように見えるんだけど…
データ量(レコード数)が少ないせいかな?

B美

そういうことね

1ページあたりのレコード数を少なく設定すれば、ページを切り替えられるようになるわよ
今回はそこまでやっておきましょうか

「index」メソッドの二行目

$counters = $this->paginate($query);

から

$counters = $this->paginate($query, ['limit' => 5]);

に変更してね
(1ページのレコード数を5件とする…って意味よ)

C菜

ブラウザ表示のあと、「next」をクリックして2ページ目を表示したら、こうなりました~

URLの表示も勝手に変わりましたし、一番下のページ番号なんかも自動的にリンクが作られてますね~

A子

まじですごいんだけど…

確かに「これを自力で作れ」って言われると、面倒くさそう(苦笑)

B美

ちなみに、上にある項目名(「Id」や「Remarks」等)をクリックすると、その項目フィールドの値で並べ替えソートもできるわよ
(昇順ソートと降順ソートの切り替えも可)

A子

いや、まじ絶句レベルで高機能だと思うわ(ちょっとあきれ顔)