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