CAKEPHP2检索条件依赖于子表的数据
我有一个奇怪的行为,我不理解我的cakephp 2。 在我的模型“研究”中,我有很多关系: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(
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.,//此处提及连接条件)),