例えばチームリストを予め準備しておき、そのデータを選手登録する際にそのリストから選ぶようなフォームを作成するとします。

cakePHPは、DBで選手用のテーブルを準備する際、仮にチームリスト用のテーブル名をTeamsとし、選手用をPlayersとします。Playersのカラムにteams_idと用意して、bakeでmodel、controller、viewを作成すると、自動でPlayersのデータを取得するときにTeamsテーブルからデータを取得するような仕組みが出来上がります。

Teamsでidというprimary keyのカラムを準備していると思うので、取り出したデータはobject型で取得して、Playersのデータ登録項目にはその項目を選択するフォームができます。

しかし、これはidの一覧が取得されたデータになるので、基本的に数字が並ぶ形となります。

入力画面で数字が並んでいるだけではどれがそのチームなのかが分かりません。

selectフォームの項目名は文字列で、valueは数字であれば選びやすく親切かと思います。

そのような仕様にしたい場合は、取得するときの命令をカスタムします。

以下のソースは自分がbakeで自動作成したcontrollerのaddアクションに書かれていた文です。

 

$teams = $this->Players->Teams->find('list', ['limit' => 200])->all();

↓

$query = $this->Players->Teams->find('list', [
  'keyField' => 'id',
  'valueField' => 'teamname'
]);
$teams = $query->toArray();

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

 

こうすることでobject型ではなくarray型でチーム名のデータが出来上がります。

view側ではフォームヘルパーで配列データを使う事で、valueはid、表示は指定カラムの文字列のselectフォームが出来上がりました。

 

echo $this->Form->select('teams_id', $teams);

 

selectフォームの表示を文字にしたい場合は便利かと思います。

因みにindex.phpの表ではidで表示される関数が用意されているので、カラム名を変更すると良いかと思います。

 

// Teamsテーブルにteamnameというカラム名を用意していた場合

$player->team->id → $player->team->teamnameと変更する

<tbody>
<?php foreach ($players as $player): ?>
<tr>
<td><?= $player->has('team') ? $this->Html->link($player->team->teamname, ['controller' => 'Teams', 'action' => 'view', $player->team->id]) : '' ?></td>
<td><?= h($player->created) ?></td>
<td><?= h($player->modified) ?></td>
</tr>
<?php endforeach; ?>
</tbody>