またどこかでCTOっぽいことやってる人のブログ

フリーランスを経て、またどこかでCTOっぽいことをやってる人が書いてます。何か色々やってます。

CakePHP3でリスト取得時のカラムを連結させてみた。

気がついたら8月が終わっていました。
あっという間に2017年もあと4ヶ月です。時間の流れの速さが恐ろしいです。

さておき。
ラジオボタンがあまり好きじゃなくてセレクトボックスの方が好きなタイプなのですが
CakePHP3だとこんな風にしてクエリを投げてView側にセットしています。
多分合ってます。

<?php
  // usersモデルを使うということにします
  $userModel = TableRegistry::get('Users');
  $userList = $userModel->find('list'), [
    'keyField' => 'id',
    'valueField' => 'user_name'
  ])
  ->toArray();

  // ViewにセットしてView側のセレクトボックスのoptionsにセット
  $this->set('userList', $userList);

インデントが様子おかしいかもしれませんが、こんな感じです。
リスト取得部分はモデルに書いた方がすっきりするかもしれません。
その辺はいつものアレですが好みです。

で。
上の例ですと「user_name」を画面上に表示するような雰囲気になりますが、例えばこれが苗字と名前に分かれていたとしたらセレクトボックスの方で連結させたいなーとなるんじゃないかと思います。
カラムだと何でしょう。family_nameとfirst_nameとかになるんですかね。
まぁその辺はどうでもいいですが、今回はそういうことにします。

文字列連結させたら終わり! と思っていたのですがやってみたら上手くいきませんでした。
いや、上手くいくかもしれませんが何だかできなかったのです。
仕方がないのでごにょごにょして実装したソースが以下です。

<?php
  // またusersモデルを使うということにします
  $userModel = TableRegistry::get('Users');
  $userList = $userModel->find('list'), [
    'keyField' => 'id',
    'valueField' => function ($entity) {
       // この部分をEntityから取得する
       // 変数は$enitityじゃなくて構いません。適当に
       return $entity->user_full_name;
    }
  ])
  ->toArray();

  // ViewにセットしてView側のセレクトボックスのoptionsにセット
  $this->set('userList', $userList);
<?php
  // usersモデルのEntity側(Model/Entity/User.php)
  protected function _getUserFullName() {
     // Entity側で苗字と名前を連結させて返す
     return $this->_properties['family_name'].$this->_properties['first_name'];
  }


のような感じで書くとキレイにカラムが連結された状態でセレクトボックスにセットされます。
functionとかなんなの。イミワカンナイという方は、以下のような書き方でもいけます。

<?php
  // これもusersモデルを使うということにします
  $userModel = TableRegistry::get('Users');
  $userList = $userModel->find('list'), [
    'keyField' => 'id',
    'valueField' => function ($entity) {
       return $entity['family_name'].$entity['first_name'];
    }
  ])
  ->toArray();

  // ViewにセットしてView側のセレクトボックスのoptionsにセット
  $this->set('userList', $userList);


ちなみに自分はイミワカンナイ派です。
お好きな方を使うといいんじゃないかなと思います。