CakePHP5入門【CakePHP5基礎編⑤】データベース操作①
B美
C菜
B美
A子
わざわざ「メイン」と言うってことは、Modelを使わない方法もあるの?
B美
まぁ、あまりお勧めはしないけどね
A子
B美
(言い換えれば、SQLに詳しい人はこっちのほうが簡単かもしれないけど…)
で、もう一つの理由は、ページネーションとの連携が難しくなるってことかな
C菜
B美
(Googleの検索結果をイメージしてもらえば良いわ)
A子
B美
ところが!
(CakePHPの機能である)「$this->paginate」メソッドを使うとあら不思議、めっちゃ簡単に「ページネーション」を実現できるのよ
C菜
B美
まぁ、私の個人的な見解としては、SQL文を直接叩くほうが楽なんだけどねー(苦笑)
さて、前置きはここまでとして、さっそく授業を始めましょう
まずはテストデータを作りたいから、以前作った「testdb.sql」を開きます
B美
で、その行(insert文)をコピーして、下記のように入力したあと、「insert.sql」というファイル名で保存してね
(「values (」の次の数値は「主キー」だから、その値が重複しないように注意すること)
C菜
B美
mysql -u root -p testdb < insert.sql[Enter] |
(MariaDBの)rootパスワードを入力すれば完了よ
A子
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美
bin/cake bake template Counters[Enter] |
を打ち込みます
めっちゃエラーみたいなやつが出るけど気にしないように(苦笑)
作業用ファイルの所有者がWebサーバ(www-data)になっていて、そのファイルに対する書き込み権限が無いせいで警告が表示されているだけだから…
|
C菜
「Counters」ディレクトリがあって、その中に4つのファイルができてますよ~
↓
A子
B美
実は前回のPostTestについても「localhost/testapp/PostTest」(パスカルケース)のほかに、「localhost/testapp/postTest」(キャメルケース)や「localhost/testapp/post-test」(ケバブケース)というURLも許可されてるのよね
(まぁ、あまり気にしなくても良いんだけど…)
A子
そんなことはともかく、何よこの画面…
まだ何もしてないってのに、めっちゃ機能が充実してるんだけど…
C菜
「NEW COUNTER」とか「View」「Edit」「Delete」とかありますよ~
(「Delete」だけは実際の削除についてはキャンセルしましたけど~)
B美
・Create
・Read
・Update
・Delete
の頭文字を並べたものね
A子
あ、でも「bake model」と「bake controller」と「bake template」を順に実行するのは少し面倒ね
B美
つまり…
もしもデータベーステーブルが「○○」という名前だったら
bin/cake bake all ○○[Enter] |
で、「MVC」全てを一度に作成できるってわけ
C菜
「PostTestController.php」のときに記述した「initialize」メソッドや「$Counters」フィールドが無かったですよ~?
B美
Modelのクラス名とController名の前半が揃っている場合、「fetchTable」メソッドは不要なのよ
(逆に、そうでない場合には「fetchTable」メソッドの実行が必要だってことなんだけど…)
A子
まじですごいと思うわ
B美
それでは、その「CountersController.php」を開いてみて
B美
一行目は今から「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菜
URLの表示も勝手に変わりましたし、一番下のページ番号なんかも自動的にリンクが作られてますね~
A子
確かに「これを自力で作れ」って言われると、面倒くさそう(苦笑)
B美
(昇順ソートと降順ソートの切り替えも可)
A子