みなさん、こんにちは。
最近、私はベータ版アプリケーションを純粋なPHP/jQueryからCakePHP/ExtJSに変換するという任務を負っています(これは私が初めてです)。
私の問題は、メイングリッドに入力する最も複雑なクエリにあります。
物事を単純にするために、正しいベイクされた関係とモデルを持つ3つのテーブルがあります:Projects
、、ToDo
ExtraToDo
Projects
hasMany ToDo
とExtraToDo
。
ToDo
とExtraToDo
列がTitle
ありComplete
ます。
私の目標は、これら3つの表に基づいて、各プロジェクトの完了率を取得することです。
私がこれについて行った方法は、列のSUMを列のCOUNTでComplete
割ったものです。私はCakePHPの方法で読みやすさ/パフォーマンス/otherstuffIdontknowyetを試しています。Complete
もともと、生のSQLでは、次のように実行していました。
SELECT
`idProject`,
(SELECT
ROUND((SUM(`Complete`) / COUNT(`Complete`)) * 100),
FROM
(SELECT `Complete`, `ProjectID` FROM `ToDo`
UNION ALL
SELECT `Complete`, `ProjectID` FROM `ExtraToDo`) orders
WHERE
`ProjectID` = `idProject`
) AS 'Completion'
FROM
`Projects`
また、CakePHPを決定する前に試した、KohanaPHPMVCフレームワークでこれをかなり簡単に機能させることができました。私は彼らのクエリがどのように作成されたかが大好きでした...:
private function get_completion() {
$Query = DB::select('ProjectID', array(DB::expr('ROUND((SUM(`Complete`) / COUNT(`Complete`)) * 100)'), 'Completion'))
->from(array('ToDo', 'ExtraToDo'))
->group_by('ProjectID');
return $Query;
}
public function get_all() {
$Query = DB::select()
->from('Projects')
->join(array(self::get_completion(), 'Completion'))
->on('projects.id', '=', 'Completion.ProjectID')
->execute()
->as_array();
return $Query;
}
残念ながら、CakePHPの方法でこれを実行している間、CakePHPでこれを機能させるのに完全に苦労しました。
virtualFieldsが私の答えの鍵であると確信していますが、ドキュメントを読んでx、y、zを試した後です。私はそれらとそれらがどのように関係しているかを理解することができませんでした。
よろしくお願いします-T6