2014-04-21 39 views
0

我有一个用户表,一个role_members表和一个角色表。如何根据深层模型关联对CakePHP进行排序或查找?

role_members表具有user_id和role_id,因为用户可以有多个角色。

我有一个DataTable,其中包含用户ID,电子邮件,名称和角色。我可以根据用户表中的字段轻松排序和过滤。 DataTable的工作方式是有一个搜索框搜索所有字段。所以,我的搜索查询需要是一个'OR',其中用户名像search_term或电子邮件像search_term或角色名称like search_term

当我尝试根据角色名称进行排序或过滤时,出现问题。 如果我想按RoleMember.Role.name排序或按RoleMember.Role.name搜索,我该怎么做?

我的查找选项如下:

$sOrder = array('User.full_name' => 'asc'); 

    if (isset($params['iSortCol_0'])) { 

     $sOrder = array(); 
     for ($i=0 ; $i<intval($params['iSortingCols']) ; $i++) 
     { 
      if ($params[ 'bSortable_'.intval($params['iSortCol_'.$i]) ] == "true") 
      { 
       $sOrder[$columns[ intval($params['iSortCol_'.$i]) ]] = $params['sSortDir_'.$i] ; 
      } 
     } 

    } 

    $find_options = array(
     'order' => $sOrder, 
     'contain' => array(

      'RoleMember' => array('Role', 'Instance'), 
      'AllowedLocation' 

     ), 
     'limit' => $limit, 
     'offset' => $offset 
    ); 


    if(isset($params['sSearch'])){ 
     $search_term = '%'. $params['sSearch'] .'%'; 
     $find_options['conditions'] = array(

      'Or' => array(
       'User.full_name LIKE ' => $search_term, 
       'User.email LIKE ' => $search_term, 
       'User.username LIKE ' => $search_term 
       //'RoleMember.Role.name LIKE ' => $search_term, 

      ) 

     ); 
    } 
+1

那么使用'joins'怎么样? –

+0

试过了。出于某种原因,它们似乎不适用。起初我以为是因为我在使用可容忍的,但我不确定。我想我应该打破调试器,看看我能否弄清楚发生了什么。 –

回答

1

加盟肯定会工作,但它会是非常低效的,如果你不缓存查询... 现在试试这个 -

$options['joins'] = array(
         array(
          'table' => 'role_members', 
          'alias' => 'RoleMember', 
          'type' => 'INNER', 
          'conditions' => array(
           'RoleMember.user_id = User.id' 
          ) 
         ), 
         array(
          'table' => 'roles', 
          'alias' => 'Role', 
          'type' => 'INNER', 
          'conditions' => array(
           'RoleMember.role_id = Role.id' 
          ) 
         ) 

); // here we join all the tables, so all fields are available to place conditions... 

$options['conditions'] = array(
          'OR' => array(
           'User.full_name LIKE ' => $search_term, 
           'User.email LIKE ' => $search_term, 
           'User.username LIKE ' => $search_term 
           'Role.name LIKE ' => $search_term, 
          ) 
); 

$users = $this->User->find('all', $options); 
+0

只是提示任何人试图做类似的事情,我也需要做GR​​OUP BY User.id –

+0

添加'$ options ['group'] = array(User.id);' –

相关问题