CakePHP对一个领域的许多条件

时间:2014-01-20 02:31:21

标签: sql cakephp find

此代码:

$conditions = array(    
    'fields' => array(
        'User.id'
        ),      
    'conditions' => array(
        'AND' => array(
            'UsersProblem.problem_id' => 38,
            'UsersProblem.problem_id' => 34,
            ),
        ),
    'recursive' => -1
    );

$conditions['joins'][] = array(
    'table' => 'users_problems',
    'alias' => 'UsersProblem',
    'type' => 'INNER',
    'conditions' => array(
        'User.id = UsersProblem.user_id',
    ));

正在转换为此SQL查询:

SELECT `User`.`id` 
FROM `lawyers`.`users` 
  AS `User` 
INNER JOIN `lawyers`.`users_problems` 
  AS `UsersProblem` 
  ON (`User`.`id` = `UsersProblem`.`user_id`) 
WHERE `UsersProblem`.`problem_id` = 34

AND UsersProblemproblem_id = 38“在哪里? 如何创建正确的查找条件以使用户获得一些问题列表?这与许多关系有很多联系。

使用 $ this->问题 - >查找是不可能的,因为我需要使用2个连接:users_problems和users_practices。并使用它们和条件,如下:

'AND' => array(
    'UsersProblem.problem_id' => 38,
    'UsersProblem.problem_id' => 34,
    'UsersPractices.practice_id' => 1,
    'UsersPractices.practice_id' => 2,
),

4 个答案:

答案 0 :(得分:4)

你正在覆盖'UsersProblem.problem_id'。试想它就像阵列一样。 CakePHP只是使用PHP数组结构来执行这些查找,这意味着它遵循数组规则。但是要在cakephp中解决这个问题,你应该使用二维数组

像这样:

'AND' => array(
        array('UsersProblem.problem_id' => 38),
        array('UsersProblem.problem_id' => 34)
),

而不是:

'AND' => array(
        'UsersProblem.problem_id' => 38,
        'UsersProblem.problem_id' => 34
),

这样,您可以制作一个类似于

的数组,而不是尝试将键'UsersProblem.problem_id'设置两次。
0 -> array('UsersProblem.problem_id' => 38)
1 -> array('UsersProblem.problem_id' => 34)

这样就行了,这是CakePHP人员在这种情况下内置到系统中的一种解决方法。

答案 1 :(得分:0)

我认为您需要使用OR代替AND:

$conditions = array(    
'fields' => array(
    'User.id'
    ),      
'conditions' => array(
    'OR' => array(
        array('UsersProblem.problem_id' => 38),
        array('UsersProblem.problem_id' => 34),
        ),
    ),
'recursive' => -1
);

您也可以按照以下方式进行推广:

 $conditions = array(    
    'fields' => array(
        'User.id'
        ),      
    'conditions' => array(
        'OR' => array(
            'UsersProblem.problem_id' => array(34, 38)
        ),
    'recursive' => -1
);

答案 2 :(得分:0)

更改条件数组,如下所示:

 $options = array(    
        'fields' => array('User.id'),      
        'conditions' => array('UsersProblem.problem_id' => array(38,34)),
        'recursive' => -1
        );
 $options['joins'] = array(
                array(
                     'table' => 'users_practices',
                     'alias' => 'UsersPractices',
                     'type' => 'INNER',
                     'conditions' => array(
                              /CONDITION OF JOIN/
                      ),
               array(
                     'table' => 'users_problems',
                     'alias' => 'UsersProblem',
                     'type' => 'INNER',
                     'conditions' => array(
                              'User.id = UsersProblem.user_id',
                      )
                );

来自用户模型:

 $this->find('list',$options);

请勿使用AND / OR,因为它们未针对上述情况进行优化。

供参考:

MYSQL OR vs IN performanceCakePHP right way to do this (get value from setting's table)

答案 3 :(得分:0)

**Try the code for join tables in cakephp.......**

$options = array('joins' => array(
                        array(
                            'table' => 'modelname1',
                            'alias' => 'modelName1',
                            'type' => 'LEFT',
                            'foreignKey' => false,
                            'conditions' => array('modelname1.id = modelname2.mid')
                        )
                    ),
                    'fields' => array('modelName1.field1', 'modelName1.field2', 'modelName2.field1', 'modelName2.field2'),
                    'conditions' => array('modelname.id' => 1, 'modelname2.field1' => ''),
                    'limit' => 10, 'page' => 1);
                $this->modelName2->find($options);