11

findまたはgetまたはその他のものを使用して、キーと値のペアで 2 つの値 (人間に優しいドロップダウン用) を取得するのに助けが必要です。CakePHP でこれを行う最も簡単な方法について助けが必要です。

これが私の試みです:

  1. 私のコントローラーで

      $users = $this->LocationsUser->Users->find('list', [
        'limit' => 1,
        'keyField' => 'id',
        'valueField' => ['first_name', 'last_name']
      ])->where(['id' => $id]);
    
  2. 私からしてみれば

      echo $this->Form->input('user_id', [
            'options' => $users,
            'type' => 'select',
            'multiple' => false,
          ]);
    
  3. 私のドロップダウンの結果:

    <option value="10">Fabian;Pankiers</option>
    

セミコロン「;」のない結果が必要ですを参照してください . これで、javascript を使用してセミコロンを削除できますが、それはやり過ぎです。CakePHP 3 内でこれを達成する簡単な方法はありますか?

4

2 に答える 2

28

これを解決するにはさまざまな方法がありますが、ここではそのうちの 3 つを紹介します。

のコールバックを使用しますvalueField

コールバックを使用し、結果の値を使用して値をつなぎ合わせます。

$query = $this->LocationsUser->Users
    ->find('list', [
        'valueField' => function ($row) {
            return $row['first_name'] . ' ' . $row['last_name'];
        }
    ])
    ->where(['id' => $id]);

こちらもご覧ください

結果フォーマッター

値をつなぎ合わせる結果フォーマッターを使用します。これは、listファインダーが内部的に行うことでもあり、基本的に上記の例と同じですが、より複雑です。

$query = $this->LocationsUser->Users
    ->find()
    ->select(['id', 'first_name', 'last_name'])
    ->formatResults(function($results) {
        /* @var $results \Cake\Datasource\ResultSetInterface|\Cake\Collection\CollectionInterface */
        return $results->combine(
            'id',
            function($row) {
                return $row['first_name'] . ' ' . $row['last_name'];
            }
        );
    })
    ->where(['id' => $id]);

仮想プロパティと組み合わせる

たとえば、エンティティ クラスfull_nameで定義されたプロパティ名を指定すると、ここで仮想プロパティを (再) 使用することもできます。User

protected function _getFullName()
{
    return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'];
}

2 つのフィールドを手動で再度結合する代わりに、フォーマッタでそれを返すことができます。

function($row) {
    return $row['full_name'];
}

この例でも同じことができますvalueField

こちらもご覧ください

計算フィールド

計算フィールドを追加し、そのフィールドをvalueFieldオプションに使用します

$query = $this->LocationsUser->Users
    ->find('list', [
        'keyField' => 'id',
        'valueField' => 'concatenated'
    ]);
$query
    ->select([
        'id',
        'concatenated' => $query->func()->concat([
            'first_name' => 'literal',
            ' ',
            'last_name' => 'literal'
        ])
    ])
    ->where(['id' => $id]);

こちらもご覧ください

リスト ファインダーをオーバーライドする

カスタム リストを常に適用する場合は、テーブル クラスlistでファインダーをオーバーライドできます。Users

use Cake\ORM\Query;

// ...

public function findList(Query $query, array $options)
{
    return $query
        ->find()
        ->select(['id', 'first_name', 'last_name'])
        // etc ...
        ;
}

そうすれば、引き続き使用できますfind('list')

こちらもご覧ください

于 2015-10-07T21:46:57.097 に答える
6

シンプルで迅速なソリューションは、魅力のように機能しました ( CakePHP 3.2.6 ):

$users = $this->LocationsUser->Users->find('list', [
    'limit' => 1,
    'keyField' => 'id',
    'valueField' => function ($e) {
            return $e->get('first_name'). ' ' . $e->get('last_name');
        }
])->where(['id' => $id]);
于 2016-07-20T16:41:04.673 に答える