我正在將原始PHP代碼遷移到CakePHP並且存在一些問題。由於我在查詢ORM轉換時遇到很大問題,我暫時使用原始SQL。一切都很好,但我遇到了難看的代碼,並不知道如何使它變得美麗。我製作了DealersController
並添加了function advanced($condition = null)
(它將通過參數1-15和69從AJAX中調用)。功能看起來像:在控制器中添加CakePHP查詢
switch ($condition) {
case '1':
$cond_query = ' AND ((d.email = \'\' OR d.email IS NULL))';
break;
case '2':
$cond_query = ' AND (d.id IN (SELECT dealer_id FROM dealer_logo)';
break;
// There are many cases, some long, some like these two
}
if($user_group == 'group_1') {
$query = 'LONG QUERY WITH 6+ TABLES JOINING' . $cond_query;
} elseif ($user_group == 'group_2'){
$query = 'A LITLE BIT DIFFERENT LONG QUERY WITH 6+ TABLES JOINING' . $cond_query;
} else {
$query = 'A LITLE MORE BIT DIFFERENT LONG QUERY WITH 10+ TABLES JOINING' . $cond_query;
}
// THERE IS $this->Dealer->query($query); and so on
所以..當你看到代碼看起來很醜。我有兩個變種:
1)退出查詢添加併爲每個條件製作模型方法,然後這些條件分離到函數。但是這不是DRY,因爲主要的3個大問題幾乎是一樣的,如果我需要改變一個東西 - 我將需要改變16個以上的查詢。 2)使小的可重用模型方法/查詢從DB小塊數據中獲得,然後不使用原始SQL,而是使用方法。這會很好,但表現會很低,我需要儘可能高。
請給我建議。謝謝!
所以..首先感謝Linkable - 我讀到它並認爲它非常有幫助! – Orbitum 2011-03-28 10:55:24
第二個 - 你提供一個函數在模型'find_big_query()'和一個小的函數'add_something_tofunction_find_big_query()'?也許在模型公共變量'additional_query_string'並添加控制器添加?什麼是「最好的方式?」 – Orbitum 2011-03-28 10:58:42
對於如何在不瞭解數據庫模式的情況下如何分解查詢,我無法做出正確的建議;你能否更具體一些? – tokes 2011-03-29 20:44:48