cakePHP4でDBからデータを取得するにはどうすればいいんだろう…
こんな疑問を解決します。
- DBから全件、特定のレコードのデータを取得できる
- 特定のカラムのデータを抽出できる
- 取得したデータをソートできる
【開発環境】
PHP8
cakePHP4
この記事では、事前にitemsテーブルを用意し、5件ほどデータを投入した状態です。
※テーブルやシーダーの作成は、以下の記事を参考にしてください。
>>cakephp4のマイグレーションを徹底解説
>>cakePHP4でseeder(シーダー)を実行
itemsテーブルの中身
また、テーブル作成後は対応するモデル・コントローラーも作成しておきましょう。
【関連記事】
・cakephp4テーブルにデータを登録
・cakephp4でテーブルのデータを更新
・cakephp4でDBのデータを削除
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
【cakePHP4】DBからデータを取得する -findで全件取得
findで全件取得できます。
例えば、一覧表示画面などで使える。
<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\ORM\TableRegistry;
/**
* Items Controller
*
* @method \App\Model\Entity\Item[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
*/
class ItemsController extends AppController
{
public function initialize(): void
{
parent::initialize();
//itemsのDBを指定
$this->items = TableRegistry::get('Items');
}
public function index()
{
$items = $this->items->find();
// デバッグを取りたい場合はtoArray()を使うと、DBbのデータのみ抽出できる
// dd($items->toArray());
$this->set(compact('items'));
}
}
<?php foreach ($items as $item): ?>
<?= $item->id ?>
<?= $item->name ?>
<?= $item->price ?>
<?= $item->content ?>
<?= $item->created_at ?>
<br>
<?php endforeach; ?>
itemsテーブルにある全件取得できました。
dd($items->toArray());とした場合のデバッグ結果
【cakePHP4】DBからデータを取得する -getで特定のidデータを取得
getで特定のidレコードを持つデータを取得できます。
例えば、詳細ページなどで使える。
public function index()
{
$id = 3;
$item = $this->items->get($id);
// デバッグを取る場合は、findみたいにtoArrayは必要ない
// dd($item);
$this->set(compact('item'));
}
<?= $item->id ?>
<?= $item->name ?>
<?= $item->price ?>
<?= $item->content ?>
<?= $item->created_at ?>
特定のレコードのみ抽出できました。
【cakePHP4】DBからデータを取得する -whereで特定の条件データを取得
whereで特定の条件を持つレコードを取得できます。
例えば、priceが1000以上のデータやnameが一致するもののみデータが欲しいなど。findと組み合わせることが多いです。
public function index()
{
$items = $this->items
->find()
->where(['price >' => 3000]);
// デバッグを取る場合は、toArrayでデータのみ抽出すると見やすい
dd($items->toArray());
}
priceが3000以上のデータを抽出できました。※全件取得の時は5件で、今回は3件取得
データベースみると、priceが3000より大きいのは3件なので、取得データとして正しいです。
whereで複数の条件をつける場合
先ほどは、whereの条件は1つだけでしたが、price > 3000に加えて、published = 1の条件も加えたい場合は、whereの[]の中に条件を足します。
public function index()
{
$items = $this->items
->find()
->where(['price >' => 3000, 'published' => 1]);
// デバッグを取る場合は、toArrayでデータのみ抽出すると見やすい
dd($items->toArray());
}
これで以下のデータでは、price > 3000,published = 1のデータを取得するので、id=1,id=2のデータ2件のみ抽出できます。
デバッグ結果※publishedはboolean型なので、true=1,false=0です。
【cakePHP4】DBからデータを取得する -selectで特定のカラムを取得
selectで特定のカラムのみ取得できます。
例えば、itemsテーブルはid,name,price,content,published,created_at,updated_atがありますが、id,name,priceのデータだけ欲しいって場合に使えます。
public function index()
{
$items = $this->items
->find()
->select(['id', 'name', 'price']);
// デバッグを取る場合は、toArrayでデータのみ抽出すると見やすい
dd($items->toArray());
}
デバッグ結果※id,name,priceのデータだけ抽出できている。
先ほどのwhereと組み合わせれば、取得するカラムを絞り、特定の条件もつけられる。
以下では、itemsテーブルからid,name,priceかつprice > 3000のデータのみ抽出します。
public function index()
{
$items = $this->items
->find()
->select(['id', 'name', 'price'])
->where(['price >' => 3000]);
// デバッグを取る場合は、toArrayでデータのみ抽出すると見やすい
dd($items->toArray());
}
【cakePHP4】DBからデータを取得する -orderでソートする
orderで取得したデータをソートできます。
例えば、price(価格)の安い順で並び替えるなど。
public function index()
{
$items = $this->items
->find()
->order(['price' => 'ASC']);
// デバッグを取る場合は、toArrayでデータのみ抽出すると見やすい
dd($items->toArray());
}
price => ASCとなっており、ASCを指定することで昇順になります。逆にDESCを指定すると、降順になります。
[昇順]1,2,3,4,5…. 数字が小さい→数字が大きい
[降順]5,4,3,2,1… 数字が大きい→数字が小さい
つまり、priceをASC(数字が小さい→数字が大きい)なので、価格が低い順、priceをDESC(数字が大きい→数字が小さい)なので、価格が高い順にソートできます。
デバッグ結果※priceが低い順でソートされている。
ちなみに、created_at(日付) => ASCは日付が古い順、created_at(日付) => DESCは日付が新しい順(最新順)になります。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
コメント