2

OK、これが私のテーブル/モデル構造です: モデルは適切に関連付けられています。

テーブル構造

特定のクライアントIDの保持値の合計を、特定の値の合計の日付を配列キーとしてクエリしようとしています。

クライアントモデルでクエリ用に次のパラメーターを作成したドキュメントを参照しました。

$findParameters = array(
    'conditions' => array(
        'Account.client_id' => $clientId,
        'Holding.holding_date = LAST_DAY(Holding.holding_date)', //gets month-end dates only
        'MONTH(Holding.holding_date)' => array(3,6,9,12) //Use for quarter-end dates
        ),
    'fields' => array(
        'Holding.holding_date',
        'SUM(Holding.value) AS portfolio_value'
        ),
    'group' => array('Holding.holding_date')
);

実行してクエリを実行すると

$holdings = $this->Account->Holding->find( 'all', $findParameters );

次のような結果が得られます。

Array
(
    [0] => Array
        (
            [Holding] => Array
                (
                    [holding_date] => 2009-12-31
                )

            [0] => Array
                (
                    [portfolio_value] => 273239.07
                )

        )

    [1] => Array
        (
            [Holding] => Array
                (
                    [holding_date] => 2010-03-31
                )

            [0] => Array
                (
                    [portfolio_value] => 276625.28
                )

        )
...

これは素晴らしいことですが、結果を次のような配列にしたい:

Array (
    [2009-12-31] => 273239.07
    [2010-03-31] => 276625.28
    ...
)

だから私はやってみます:

$holdings = $this->Account->Holding->find( 'list', $findParameters )

しかし、私はエラーが発生します:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Account.client_id' in 'where clause'

クエリは、テーブルで結合を実行していないように見えます。代わりalllist? そして、私の望ましい結果を得るにはどうすればよいですか?


編集:Cakeのhashクラスを使用して結果を達成しましたが、直接クエリが優れたより効率的な方法であるかどうか疑問に思っていました.

私の方法:

    $holdings = $this->Account->Holding->find( 'all', $findParameters );

    $values = Hash::extract($result, '{n}.0.portfolio_value');
    $dates = Hash::extract($result, '{n}.Holding.holding_date');

    $result = array_combine($dates, $values);
    return $result;
4

2 に答える 2

2

一般的なコメント

CakePHP の ORM は、簡単な検索クエリ ( group by sort... を含む) に最適です。より高度なものになると、取得したデータを PHP で処理するか、単純な SQL Queryを作成する必要があります。

連想配列複写について

Model::find('all')またはModel::find('first')常に連想配列を返します。他の検索メソッドは異なる種類の配列を返しますが、標準のモデル関数を使用して探している結果を取得することはできません。

正しいサブアレイに追加されないフィールドについて

を持っているときにフィールドを適切に一緒に表示するにはSUM()AVG()またはSQL クエリでここで読むことCOUNT()ができますvirtual fields

CakePHP で配列を抽出/フォーマットする方法

最も簡単な方法は、Hashクラスを使用して、必要な方法でデータを抽出およびフォーマットすることです。

あなたを使用Hash::combineすると、次のように探しているものを達成できます:

$result = Hash::combine($holdings, '{n}.Holding.holding_date', '{n}.0.portfolio_value');
于 2013-09-13T13:51:29.457 に答える