원시 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) 모든 조건에 대해 질의를 추가하고 모델 방법을 만든 다음, 이러한 조건은 기능과 분리된다. 그러나 주요 3 개의 큰 쿼리가 거의 동일하기 때문에 DRY가 아닙니다. 한 가지를 변경해야 할 경우 16 개 이상의 쿼리를 변경해야합니다.
2) 작은 재사용 가능한 모델 방법/쿼리가 데이터베이스의 작은 조각에서 나올 수 있도록 만든 다음 원시 SQL을 사용하지 않고 방법으로 재생합니다. 그것은 좋을 것이나, 성과는 낮을 것이고 나는 그것을 가능한 한 높이 필요로한다.
제게 조언을주십시오. 고맙습니다! 쿼리의 기초 부분이 동일한 경우
그래서 .. Linkable에 대한 첫 번째 감사에 대해 - 나는 그것에 대해 읽고 그것을 매우 도움이된다고 생각합니다! – Orbitum
두번째로 - find_big_query() 모델과 add_something_tofunction_find_big_query() 함수가 하나 더 작다. 아마도 모델의 public 변수'additional_query_string'을 만들고 컨트롤러에서 추가 된 내용을 추가 할 것인가? "가장 좋은 방법은 무엇입니까?" – Orbitum
데이터베이스 스키마에 대해 알지 못해도 쿼리를 분할하는 방법에 대해 적절한 권장 사항을 만들 수 없습니다. 좀 더 구체적으로 부탁해 주시겠습니까? – tokes