Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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
CAKEPHP2检索条件依赖于子表的数据_Cakephp_Cakephp 2.0_Cakephp Model - Fatal编程技术网

CAKEPHP2检索条件依赖于子表的数据

CAKEPHP2检索条件依赖于子表的数据,cakephp,cakephp-2.0,cakephp-model,Cakephp,Cakephp 2.0,Cakephp Model,我有一个奇怪的行为,我不理解我的cakephp 2。 在我的模型“研究”中,我有很多关系: class Study extends AppModel { public $hasOne = array( 'SubjectFilter' => array( 'className' => 'Subject_filter', 'dependent' => true ) ); public $hasMany = array(

我有一个奇怪的行为,我不理解我的cakephp 2。 在我的模型“研究”中,我有很多关系:

class Study extends AppModel {

public $hasOne = array(
    'SubjectFilter' => array(
        'className' => 'Subject_filter',
        'dependent' => true
    )

    );


public $hasMany = array(

    'ExecutedStudyTable' => array(
            'className' => 'ExecutedStudyTable',
            'foreignKey' =>'study_id',
            'dependent' => true,
    ),   

);
ExecuteTStudyTable模型如下所示:

class ExecutedStudyTable extends AppModel {

    public $belongsTo= array(
    'Study' => array(
        'className' => 'Study',
        'foreignKey' => 'study_id'
    ),
    'User' => array(
        'className' => 'User',
        'foreignKey' => false,
        'conditions' => array('ExecutedStudyTable.user_id = User.id')
    )

);
 SELECT `Study`.`id`, `Study`.`user_id`, `Study`.`created`, `Study`.`modified`, `Study`.`started`, `Study`.`completed`, `Study`.`title`, `Study`.`description`, `Study`.`numberParticipants`, `Study`.`state`, `User`.`id`, `User`.`username`, `User`.`password`, `User`.`role`, `User`.`firstName`, `User`.`familyName`, `User`.`email`, `User`.`addressStreet`, `User`.`addressCity`, `User`.`addressZip`, `User`.`phone1`, `User`.`phone2`, `User`.`created`, `User`.`modified`, `User`.`passwordResetCode`, `User`.`passwordResetDate`, `User`.`sendUsernameDate`, `SubjectFilter`.`id`, `SubjectFilter`.`study_id`, `SubjectFilter`.`m`, `SubjectFilter`.`f`, `SubjectFilter`.`age18_24`, `SubjectFilter`.`age25_34`, `SubjectFilter`.`age35_44`, `SubjectFilter`.`age45_54`, `SubjectFilter`.`age55plus`, `SubjectFilter`.`studyCode` FROM `eyevido`.`studies` AS `Study` LEFT JOIN `eyevido`.`users` AS `User` ON (`Study`.`user_id` = `User`.`id`) LEFT JOIN `eyevido`.`subject_filters` AS `SubjectFilter` ON (`SubjectFilter`.`study_id` = `Study`.`id`) WHERE `Study`.`user_id` = 1402402538 AND ((`Study`.`state` = 'active') OR (`Study`.`state` = 'rehearsal')) AND `SubjectFilter`.`studyCode` IS NULL AND `ExecutedStudyTable`.`user_id` = 1130451831
} 检索数据时,在我尝试执行以下操作之前,一切看起来都很好:

        $studies = $this -> Study -> find('all',array(
 'conditions' => array(
            'Study.user_id' => $cId,
            'OR'=>array(
                array('Study.state'=>'active'),
                array('Study.state'=>'rehearsal')
            ),                
            'SubjectFilter.studyCode'=>null,
            'ExecutedStudyTable.user_id'=>$user
 )
    ));
我得到了这个错误:
error:SQLSTATE[42S22]:未找到列:1054未知列'executestudytable.user\u id'位于'where子句'

Cakephp按如下方式构建此查询:

class ExecutedStudyTable extends AppModel {

    public $belongsTo= array(
    'Study' => array(
        'className' => 'Study',
        'foreignKey' => 'study_id'
    ),
    'User' => array(
        'className' => 'User',
        'foreignKey' => false,
        'conditions' => array('ExecutedStudyTable.user_id = User.id')
    )

);
 SELECT `Study`.`id`, `Study`.`user_id`, `Study`.`created`, `Study`.`modified`, `Study`.`started`, `Study`.`completed`, `Study`.`title`, `Study`.`description`, `Study`.`numberParticipants`, `Study`.`state`, `User`.`id`, `User`.`username`, `User`.`password`, `User`.`role`, `User`.`firstName`, `User`.`familyName`, `User`.`email`, `User`.`addressStreet`, `User`.`addressCity`, `User`.`addressZip`, `User`.`phone1`, `User`.`phone2`, `User`.`created`, `User`.`modified`, `User`.`passwordResetCode`, `User`.`passwordResetDate`, `User`.`sendUsernameDate`, `SubjectFilter`.`id`, `SubjectFilter`.`study_id`, `SubjectFilter`.`m`, `SubjectFilter`.`f`, `SubjectFilter`.`age18_24`, `SubjectFilter`.`age25_34`, `SubjectFilter`.`age35_44`, `SubjectFilter`.`age45_54`, `SubjectFilter`.`age55plus`, `SubjectFilter`.`studyCode` FROM `eyevido`.`studies` AS `Study` LEFT JOIN `eyevido`.`users` AS `User` ON (`Study`.`user_id` = `User`.`id`) LEFT JOIN `eyevido`.`subject_filters` AS `SubjectFilter` ON (`SubjectFilter`.`study_id` = `Study`.`id`) WHERE `Study`.`user_id` = 1402402538 AND ((`Study`.`state` = 'active') OR (`Study`.`state` = 'rehearsal')) AND `SubjectFilter`.`studyCode` IS NULL AND `ExecutedStudyTable`.`user_id` = 1130451831
ExecutedStudyTable不像SubjectFilter那样连接,并且没有为该表定义别名。为什么这在hasOne关系上正确,而在hasMany关系上不正确?我在哪里犯错误


非常感谢您的回复

如果您想通过关联模型的字段筛选模型,一种方法是通过

注意:为模型ExecutedStudyTable指定正确的表名。还要提到两个表之间的连接条件

$studies = $this->Study->find('all',array(
 'fields' => array('Study.*'),
 'joins' => array(
      array('table' => 'executed_study_table', // Table name
        'alias' => 'ExecutedStudyTable',
        'type' => 'INNER',
        'conditions' => array(
            'ExecutedStudyTable.<field name> = Study.<field>', // Mention join condition here
        )
    )
 ),
 'conditions' => array(
        'Study.user_id' => $cId,
        'OR'=>array(
            array('Study.state'=>'active'),
            array('Study.state'=>'rehearsal')
        ),                
        'SubjectFilter.studyCode'    => null,
        'ExecutedStudyTable.user_id' => $user
  ),
  'recursive' => -1
));
$studies=$this->Study->find('all',数组(
'fields'=>array('Study.*'),
'连接'=>数组(
数组('table'=>'executed\u study\u table',//表名
'alias'=>'ExecutedStudyTable',
'类型'=>'内部',
“条件”=>数组(
'ExecutedStudyTable.=Study.',//在此处提及连接条件
)
)
),
“条件”=>数组(
'Study.user_id'=>$cId,
'或'=>数组(
数组('Study.state'=>'active'),
数组('Study.state'=>'precause')
),                
'SubjectFilter.studyCode'=>null,
'ExecutedStudyTable.user\u id'=>$user
),
“递归”=>-1
));

如果要按关联模型的字段筛选模型,一种方法是按

注意:为模型ExecutedStudyTable指定正确的表名。还要提到两个表之间的连接条件

$studies = $this->Study->find('all',array(
 'fields' => array('Study.*'),
 'joins' => array(
      array('table' => 'executed_study_table', // Table name
        'alias' => 'ExecutedStudyTable',
        'type' => 'INNER',
        'conditions' => array(
            'ExecutedStudyTable.<field name> = Study.<field>', // Mention join condition here
        )
    )
 ),
 'conditions' => array(
        'Study.user_id' => $cId,
        'OR'=>array(
            array('Study.state'=>'active'),
            array('Study.state'=>'rehearsal')
        ),                
        'SubjectFilter.studyCode'    => null,
        'ExecutedStudyTable.user_id' => $user
  ),
  'recursive' => -1
));
$studies=$this->Study->find('all',数组(
'fields'=>array('Study.*'),
'连接'=>数组(
数组('table'=>'executed\u study\u table',//表名
'alias'=>'ExecutedStudyTable',
'类型'=>'内部',
“条件”=>数组(
'ExecutedStudyTable.=Study.',//在此处提及连接条件
)
)
),
“条件”=>数组(
'Study.user_id'=>$cId,
'或'=>数组(
数组('Study.state'=>'active'),
数组('Study.state'=>'precause')
),                
'SubjectFilter.studyCode'=>null,
'ExecutedStudyTable.user\u id'=>$user
),
“递归”=>-1
));

好的,我可以这样做,就像你说的,但是为什么连接会自动用于与我的模型SubjectFilter的hasOne关系?我没有收到这方面的错误消息,连接是由cake完成的,正如您在SQL查询中看到的,实际上,它与hasOne关系无关。Join独立工作。这就是为什么我们在CakePHP 1和2的旧版本中添加了
recursive=-1
,很难根据关联模型过滤数据。我们可以使用Containable行为,但我更喜欢JOIN。Containable行为更适合CakePHP 3.xB,也更灵活,但如果ExecutedStudyTable中没有任何要加入的记录,则此操作将失败。有没有一种方法可以说'ExecutedStudyTable.user\u id'=>$user或ExecutedStudyTable为空?当执行左联接而不是内部联接时,它会起作用:'joins'=>array(数组('table'=>'executed\u study\u table',//表名'alias'=>'ExecutedStudyTable','type'=>'left','conditions'=>array('ExecutedStudyTable.=Study.,//此处提及连接条件))),好的,我可以这样做,就像你说的,但是为什么连接会自动为我的模型SubjectFilter的hasOne关系工作?我没有收到错误消息,连接是由cake完成的,正如你在SQL查询中看到的那样。实际上,它与hasOne关系无关。连接独立工作。这就是为什么我们添加了<代码>递归=-1在旧版本的CakePHP 1和2中,很难根据关联模型过滤数据。我们可以使用可包含行为,但我更喜欢加入。可包含行为更适合CakePHP 3.xB,更灵活,但当ExecutedStudyTable中没有任何记录可供加入时,这将失败。有没有类似的说法'ExecutedStudyTable.user\u id'=>$user或ExecutedStudyTable为空?在执行左联接而不是内部联接时,它将起作用:“联接”=>数组(数组('table'=>'executed\u study\u table',//表名'alias'=>'ExecutedStudyTable','type'=>'left','conditions'=>数组('ExecutedStudyTable.=Study.,//此处提及连接条件)),