【市場価値がわかる】エンジニア転職におすすめなサイト

cakephp4でDBのデータを取得する方法を解説

cakephp4データの取得

cakePHP4でDBからデータを取得するにはどうすればいいんだろう…

こんな疑問を解決します。

本記事のゴール
  • DBから全件、特定のレコードのデータを取得できる
  • 特定のカラムのデータを抽出できる
  • 取得したデータをソートできる

【開発環境】
PHP8
cakePHP4

この記事では、事前にitemsテーブルを用意し、5件ほどデータを投入した状態です。
※テーブルやシーダーの作成は、以下の記事を参考にしてください。
>>cakephp4のマイグレーションを徹底解説
>>cakePHP4でseeder(シーダー)を実行

itemsテーブルの中身

また、テーブル作成後は対応するモデル・コントローラーも作成しておきましょう。

【関連記事】
cakephp4テーブルにデータを登録
cakephp4でテーブルのデータを更新
cakephp4でDBのデータを削除

Contents

【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は日付が新しい順(最新順)になります。

>>転職するのにおすすめのサイトはこちらをクリック
>>副業で稼ぐためにおすすめのサイトはこちらをクリック

スキルを売り買いするならココナラ

オンライン動画学習ならUdemy

コメント

コメントする

CAPTCHA


Contents
閉じる