cakephp テーブルの値を取得して一覧表示する基本をおさえる

2020年6月15日

今回扱う環境:cakephp3.8
db:mysql(MAMP)

データベースのテーブル名を「menu」として作成していきます。

データベースの規約

CakePHP のモデルに対応するテーブル名は、複数形でアンダースコア記法です。
例) users 、 article_categories 、 user_favorite_pages 

hasMany, blongsTo, hasOne 中の外部キー(アソシエーション)は、関連するモデルの(単数形の)名前に _id を付けたものとして認識されます。
ユーザーが記事を複数持っている (Users hasMany Articles) としたら、 articles テーブルは、 user_id を外部キーとして users テーブルのデータを参照します。

Modelの規約

Table クラスの名前は複数形でパスカルケースで、最後に Table が付きます。 UsersTableArticleCategoriesTableUserFavoritePagesTable などは usersarticle_categoriesuser_favorite_pages テーブルに対応するテーブルクラス名の例です。

Modelフォルダ

テーブルフォルダにMenus.php, エンティティフォルダにMenu.phpを作成します。ポイントはエンティティが単数なのに対し、テーブルは複数で名前づけすることです。

テーブル・クラスを作成する

テーブルクラスは必要なテーブルに対して必ず1つ作成する。

<?php
namespace App\Model\Table;
use Cake\ORM\Table;
class Menu extends Table
{
public function initialize(array $config){
parent::initialize($config);
$this->setTable('people');
$this->setDisplayField('name');
$this->setPrimaryKey('id');
}
}

テーブル名

$this->setTable('people’);

データベーステーブルの名前を設定します。テーブルクラスはデフォルトで同名のテーブルにアクセスしますがここで設定すると他のテーブルにもアクセスできます。

エンティティ・クラスを作成する

<?php
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Menu extends Entity
{
}

Controllerフォルダ

テーブルとエンティティを使ってデータベースにアクセスします。menuテーブルにアクセスするときは「MenuController」を用意します。

[テーブル名]Controllerを作成する

<?php
namespace App\Controller;
use App\Controller\AppController;
class MenusController extends AppController
{
public function index()
    {
        $data = $this->Menus->find('all');
        $this->set('data', $data);
    }
}

Templateフォルダ

ビューテンプレートの作成

$data->toAray()で取得したテーブルの値を連想配列にします。

<?php 
foreach($data->toArray() as $obj):
<tr>
<td><?=?></td>

たとえば次のように展開できます。

<?php 
foreach($data->toArray() as $obj): ?>
<tr>
<td><?= h($obj->id) ?></td>
<td><?= h($obj->name) ?></td>
<td><?= h($obj->date) ?></td>
</tr>
<?php endforeach; ?>