cakephp搜索标准使用相关模型

时间:2011-02-16 17:40:44

标签: php cakephp cakephp-1.3 cakephp-appmodel

我在处理根据不同但相关的表上的搜索条件获取项目列表时遇到了问题。我需要清楚地知道如何处理这种情况。这是我最简单的例子:

如果我有一个代理模型(使用一个名为referral的表,主键为r_num,一个代理模型使用一个名为代理的表,代理表包含一个连接到代理商的r_num的外键,该代理可以有很多剂:

表:推荐

r_num int -- primary key auto incremented
r_company varchar(50) -- the name of the agency
... other fields don't matter

表:代理商

a_num int -- primary key auto incremented
r_num int -- foreign key to the referral table
a_lname varchar(50) -- agent's last name
a_fname varchar(50) -- agent's first name
a_email varchar(50) -- agent's email

型号:

class Agency extends AppModel {
    var $name = 'Agency';   
    var $useTable = 'referral';
    var $primaryKey = 'r_num'; 

    var $hasMany = array(
         'Agent' => array(
         'className' => 'Agent',
         'foreignKey' => 'r_num',
        'order' => 'Agent.a_lname DESC',
        'dependent'=> true
         )  
     ); 
}
class Agent extends AppModel {
    var $name = 'Agent';    
    var $primaryKey = 'a_num'; 

}

我想要的是使用$ this-> Agency-> find('all')使用搜索表单中的条件返回列表,其中包括代理名字,代理姓氏,代理电子邮件。我需要一份代理公司名称和ID列表,但搜索条件基于代理。我有几个不同的模型将使用它,所以我需要有关它如何工作的文档。基于我在网上找到的东西我尝试过的是这个在AgencyController中可以工作,但它是一个黑客,对我的一些更复杂的情况不起作用:我需要这样做而不需要多次调用,因为一些我的表将返回大量的行,并在这些查询上使用这种技术需要几分钟。

class AgenciesController extends AppController {
   var $helpers = array ('Html','Javascript', 'Form', 'Paginator', 'Ajax', 'Phoneformat');
   var $name = 'Agencies';
   var $components = array('RequestHandler', 'RentalValidation'); 

   var $uses = array('Agency', 'Agent');

    function index() {
      $criteria =  $this->postConditions($this->data);

      if (empty($criteria)){
         $arrArgs = $this->passedArgs;
         unset($arrArgs['page']);
         $criteria = $arrArgs;
      }
      $searchcriteria = array();
      foreach (array('Agency.r_state', 'Agency.r_company') as $item ) {
         $itemvalue = '';
         if (isset($criteria[$item])){
            $itemvalue = $criteria[ $item];
            if (!empty($itemvalue)) {
               $searchcriteria[$item . " LIKE "] = '%' .  $itemvalue .'%';
            }
         }
      }
      foreach (array('Agent.a_lname', 'Agent.a_email') as $item ) {
         $itemvalue = '';
         if (isset($criteria[$item])){
            $itemvalue = $criteria[ $item];
            if (!empty($itemvalue)) {
               $agent_rnums = $this->Agent->find('list', 
               array('conditions' => 
                    array($item . " LIKE " => '%'. $itemvalue .'%'), 
                         'fields' => 'Agent.r_num'));
               $searchcriteria['r_num'] = $agent_rnums;
            }
         }
      }
      $this->set('passedCriteria', $criteria);
      $data = $this->paginate('Agency', $searchcriteria);   
      if (count($data) == 1) {
         $referralid = $data[0]['Agency']['id'];
         $this->redirect(array('action' => 'edit', $referralid));
      }
      $this->set('agencies', $data);
   }    
}

1 个答案:

答案 0 :(得分:0)

难道你不能这样做吗?

  • 获取符合所需条件的所有代理商
  • 执行Set :: combine以获取agency_ids(并使其无法统一)
  • 使用IN agency_ids查询

那样只会有2个sql调用