2012-08-24 2 views
0

우리는 플롯에 심을 수있는 플롯과 빈을 가지고 있습니다.비교를위한 CakePHP 마법 findBy 방법

소유자가있는 모든 플롯을 찾으려면 다음을 사용하도록 절대적으로 결정됩니다.

$ plots = $ this-> Plot-> findAllByOwnerAndBean_id (uid, '> 0');

그러나, 그것은 나에게 SQL WHERE 플롯 . 소유자 = '15' AND 플롯 .= '> 0'

This suggests it may be impossible

bean_id을 제공하지만, 나는 그것이 최종입니다 생각하지 않습니다. (잠재적으로 2.2와 관련이 있습니다.) 그리고 그럴 수도 있습니다. 질문은 두 가지입니다.

findBy에서 원하는 것을 어떻게 얻을 수 있습니까? 정말로 할 수 없다면 어떻게 피할 수 있습니까? 다음 코드보다 코드가 작아서 작동을 확인할 수 있습니까?

$plots = $this->Plot->find('all', array(
    'conditions' => array(
     'owner'  => uid, 
     'bean_id >' => 0 
    ) 
    )); 

답변

1

나는 (그 사용자의 입력은 당신이 스스로를 소독해야 할 것이다 경우 DboSource :: 식으로 작동 할 수()하지만)가 마법의 방법으로 가능할 것이다 표시되지 않습니다. 그러나 모델에서 도우미 메서드 만 만들 수 있습니다.

class Plot extends AppModel { 

    public function findAllByOwnerAndBeanId($owner, $beanId) { 
     return $this->find('all', array(
      'conditions' => array(
       'owner'  => $owner, 
       'bean_id >' => $beanId, 
      ), 
     )); 
    } 

} 

편집 : 다음을 시도해도되지만 테스트되지 않았 음을 유의하십시오.

$ds = $this->Plot->getDataSource(); 
$plots = $this->Plot->findAllByOwnerAndBean_id($uid, $ds->expression('> ' . intval($userInputtedBeanId))); 

Sanitize::escape()보다는 INTVAL 더 좋을 수 있습니다.

+0

슬프게도 내가 원하는 것을 실제로 할 수있는 방법이없는 것 같습니다. $ ds->는 효과가 없었지만 노력에 감사드립니다. 함수 정의에 관해서는, 이것에 대한 필자의 필요성을 제거합니다. : P 나는 find()로 계속해서 누군가가 할 말이 있는지 살펴 보겠습니다. 정말 고마워. –

+0

완전히 제거 할 필요는 없습니다. 코드를 재사용 및 테스트 할 수있게 해줍니다. 더 매끄러운 모델, 더 깔끔한 컨트롤러. – tigrang