1

CakePHP3 Table ORM オブジェクトから次の出力を取得しようとしています:

array(
       [primarykey] => array (
                                 'name' => 'users name',
                                 'created_by' => 'created by data'
                             ) 
     )

私は使用してみました:

$users->find('list',    [
                            'keyField' => 'id',
                            'valueField' => ['name', 'created_by']
                        ])
            ->where(['is_active' => 1])
            ->toArray();

ただし、これは name 列と created_by 列を「;」で区切られた文字列に連結するだけです。例:

[1]=>「ユーザー名;データで作成」

データを取得したときに手動で解析せずにこれを行うにはどうすればよいですか?

私はhttp://book.cakephp.org/3.0/en/orm/retrifying-data-and-resultsets.html#finding-key-value-pairsを見ましたが、リスト以外の例を見ることができません一次元。

ありがとう、

4

1 に答える 1

5

listこれにファインダーを使用するのは、単に間違ったアプローチだと思います。探しているものを返すようにすることはできますが、リストファインダーが最初に返すことを意図していたものを完全に変更しているため、それはちょっとハックだと思います。

したがって、listファインダーを捨て、ハイドレーションを無効にし、たとえばコレクションindexByメソッドを使用します(クエリオブジェクトはコレクションです)

$users
    ->find()
    ->select(['id', 'name', 'created_by'])
    ->where(['is_active' => 1])
    ->hydrate(false)
    ->indexBy('id')
    ->toArray();

これは次のようなものを返します

[
    pk => [
        'pk' => pk,
        'name' => 'name',
        'created_by' => 'created_by'
    ]
    // ...
]

結果に主キー フィールドを含めたくない場合は、マッパーを使用して削除します。

$users
    ->find()
    ->select(['id', 'name', 'created_by'])
    ->where(['is_active' => 1])
    ->hydrate(false)
    ->indexBy('id')
    ->map(
        function ($row) {
            unset($row['id']);
            return $row;
        }
    )
    ->toArray();

こちらもご覧ください

于 2016-01-05T14:15:34.920 に答える