Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cakephp 连接查询,在hasMany关联中建立条件_Cakephp_Inner Join_Has Many Through - Fatal编程技术网

Cakephp 连接查询,在hasMany关联中建立条件

Cakephp 连接查询,在hasMany关联中建立条件,cakephp,inner-join,has-many-through,Cakephp,Inner Join,Has Many Through,我使用的是CakePHP2.3.6。在一个项目中,我使用hasMany关联中的联接查询来搜索一些数据。我的情况应该是: User.gender='male' AND User.country='USA' AND (Education.level='under_graduate' AND Education.result >= 3.5 AND Education.institute='college 1') AND (Education.level='graduate' AND Educat

我使用的是CakePHP2.3.6。在一个项目中,我使用hasMany关联中的联接查询来搜索一些数据。我的情况应该是:

User.gender='male' AND User.country='USA'
AND
(Education.level='under_graduate' AND Education.result >= 3.5 AND Education.institute='college 1')
AND
(Education.level='graduate' AND Education.result >= 3 AND Education.institute='college 2')
我尝试的是:

$this->paginate['User']['conditions']['AND']['User.gender']='male';
$this->paginate['User']['conditions']['AND']['User.country']='USA';
$this->paginate['User']['joins'][]=array('table'=>'educations','alias'=>'Education','type'=>'INNER','conditions'=>array('Education.user_id=User.id'));
$this->paginate['User']['conditions']['AND'][0]['AND']['Education.result >= ']=3.5;
$this->paginate['User']['conditions']['AND'][0]['AND']['Education.level']='under_graduate';
$this->paginate['User']['conditions']['AND'][0]['AND']['Education.institute']='college 1';
$this->paginate['User']['conditions']['AND'][1]['AND']['Education.result >= ']=3;
$this->paginate['User']['conditions']['AND'][1]['AND']['Education.level']='graduate';
$this->paginate['User']['conditions']['AND'][1]['AND']['Education.institute']='college 2';
我生成此条件数组:

[User] => Array
    (
        [conditions] => Array
            (
                [AND] => Array
                    (
                        [User.gender] => male
                        [User.country] => USA
                        [0] => Array
                            (
                                [AND] => Array
                                    (
                                        [Education.result >= ] => 3.5
                                        [Education.level] => under_graduate
                                        [Education.institute] => college 1
                                    )

                            )

                        [1] => Array
                            (
                                [AND] => Array
                                    (
                                        [Education.result >= ] => 3
                                        [Education.level] => graduate
                                        [Education.institute] => college 2
                                    )

                            )

                    )

            )

        [joins] => Array
            (
                [0] => Array
                    (
                        [table] => educations
                        [alias] => Education
                        [type] => INNER
                        [conditions] => Array
                            (
                                [0] => Education.user_id=User.id
                            )

                    )

            )

    )
但是,当我使用这个条件搜索时,它会返回一个空的结果数组,但我知道数据库中有一些满足这些条件

那么,这里出了什么问题?我该怎么办?请帮帮我


谢谢。

您的查询正在使用all和语句,因此可能无法实现。 不会有一行带有
Education.level='under_graduate'
'Education.level'='graduate'
,因为字段不能同时具有这两个值。 您需要在查询中添加OR,例如:

User.gender='male' AND User.country='USA'
AND
(
    (Education.level='under_graduate' AND Education.result >= 3.5 AND Education.institute='college 1')
    OR
    (Education.level='graduate' AND Education.result >= 3 AND Education.institute='college 2')
)
我刚才增加了一组括号,并将与教育有关的两条条文之间的and改为and。
希望您能够将其转换为CakePHP格式,并且它会起作用

所以我知道您需要找到一个受过两种教育的用户。看,在你的条件和陈述中,你试图找到教育。学院将同时等于“学院1”和“学院2”,这是不可能的。所以,有一种方法可以通过为同一个表添加多个联接来找到它。像这样:

    $options['conditions']['User.gender']='male';
    $options['conditions']['User.country']='USA';
    $options['joins'][]=array(
        'table'=>'educations',
        'alias'=>'FirstEd',
        'type'=>'INNER',
        'conditions'=>array('FirstEd.user_id=User.id')
    );
    $options['joins'][]=array(
        'table'=>'educations',
        'alias'=>'SecondEd',
        'type'=>'INNER',
        'conditions'=>array('SecondEd.user_id=User.id')
    );
    $options['conditions']['AND'][0]['FirstEd.result']=3.5;
    $options['conditions']['AND'][0]['FirstEd.level'] = 'under_graduate';
    $options['conditions']['AND'][0]['FirstEd.institute']='college 1';
    $options['conditions']['AND'][1]['SecondEd.result']=3;
    $options['conditions']['AND'][1]['SecondEd.level']='graduate';
    $options['conditions']['AND'][1]['SecondEd.institute']='college 2';

    $this->Paginator->settings = $options;
    $users = $this->Paginator->paginate('User');

这不是最好的解决方案,但对我来说很有效。

是的,我也这么认为,这就是为什么我现在这么做的原因。但是,有没有办法做到这一点?事实上,我需要这样做,而不是。你知道吗@Ellaryans听起来你已经找到答案了!您正在努力构建的查询不会返回结果,但我误解了您的最终目标,因为问题中没有说明。无论如何,当您构建查询时,首先直接在DB上检查它们,以确保结果符合您的期望,这会有所帮助!是的,那是真的,我应该先做。谢谢:)@EllaRyanbtw,我在SQL中找到了一个很好的解决方案。非常感谢,它在这里工作:)。你帮了我太多了。顺便问一下,你为什么说这不是最好的解决方案@番茄酱