我正在将原始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