如何基于深层模型关联在CakePHP中进行排序或查找?

时间:2014-04-21 19:02:49

标签: cakephp-1.3 containable

我有一个users表,一个role_members表和一个角色表。

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

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

的role_name

当我尝试根据角色名称进行排序或过滤时出现问题。 如果我想按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 个答案:

答案 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);