0

私はCakePHP2.1.3を使用しています。コントローラで動的に仮想フィールドを作成したい。出来ますか?問題は、テーブルで最大値を見つけようとすると、モデル配列から別の配列が得られることです。さらに詳しい情報が必要な場合はお問い合わせください。

次のクエリを実行しようとすると、

$find_max_case_count = $this->CaseMaster->find('first', array(
    'conditions' => array(
        'CaseMaster.CLIENT_ID' => $client_id,
        'CaseMaster.CASE_NO LIKE' => '%-%'
    ),
    'fields' => array('max(CaseMaster.CASE_NO) AS MAX_NO')
));

それは私に次のような配列を与えています:

[0]=> array([MAX_NO]=> 52)

しかし、私はそれを次のようにしたいと思います:

[CaseMaster] => array([MAX_NO] => 52)
4

3 に答える 3

8

私は解決策を見つけました。実行時に仮想フィールドを作成できます。コードは次のようになります。

$this->CaseMaster->virtualFields['MAX_NO'] = 0;

検索クエリのすぐ上に書き込むと、クエリは書き込まれたままになります。 このリンクは、解決策を見つけるのに役立ちました。

于 2012-07-23T06:34:38.723 に答える
3

「オンザフライ」で仮想フィールドを作成する方法は(私が知っている限り)ありません。仮想フィールドとは、検索がモデルを実行するときに実行され、「他のモデルフィールドと一緒にモデルのキーの下でインデックスが作成される」 「任意のSQL式」です。

「動的に作成された仮想フィールド」をどうする必要がありますか?何を達成する必要があるかを正確に説明すると、別の(さらに適切な?:))ソリューションを提供できる可能性がありますか?私は個人的にあなたを助けたいと思います。

質問を編集した後、取得しているのは配列が返される方法であると言えます。これは、fieldsパラメーターが原因です。別の構造を取得したい場合は、コールバックを適用してフォーマットすることをお勧めします。まず、メソッドをCaseMaster Model:内に移動します。

public function getMaxCaseCount($client_id){
$data = $this->find('first', array(
                   'conditions' => array(
                                   'CaseMaster.CLIENT_ID' => $client_id,  
                                   'CaseMaster.CASE_NO LIKE' => '%-%'),
                   'fields' => array('max(CaseMaster.CASE_NO) AS MAX_NO')));
return array_map(array('CaseMaster', '__filterMaxCaseCount'), $data);
}

private function __filterMaxCaseCount($input){
    //This is just an example formatting
    //You can do whatever you would like here.
    $output['CaseMaster'] = $input[0];
    return $output;
}

array_map関数は、コールバックメソッドを適用して、__filterMaxCaseCountのように呼び出します。

$this->CaseMaster->getMaxCaseCount($client_id);

コントローラから、必要な方法でデータを取得します。array_map関数も次のようになります。

return array_map(array($this, '__filterMaxCaseCount'), $data);

あなたは同じクラスにいるからです。

于 2012-07-04T07:33:59.030 に答える
0

モデルエイリアスをフィールド定義に追加するだけでも、この目的で機能します

'fields' => array('max(CaseMaster.CASE_NO) AS CaseMaster__MAX_NO')
于 2013-08-17T18:22:09.280 に答える