关联模型中的CakePHP条件

关联模型中的CakePHP条件,cakephp,model,conditional-statements,database-relations,contain,Cakephp,Model,Conditional Statements,Database Relations,Contain,我有一个数据库,其中包含类,学期,用户,以及访问(访问是用户和类的联接表) 这些关系是: UserhasandbelongtomanyClass(通过访问 课程属于学期 现在,我想查看活动的学期中类的所有访问(学期表中有一个字段处于活动状态) 我阅读了关于find方法的contain选项,并尝试了以下方法: $option = array( "contain" => array( "Class" => array( "Semester" =&

我有一个数据库,其中包含
学期
用户
,以及
访问
访问
用户
的联接表) 这些关系是:

User
hasandbelongtomany
Class
(通过访问
课程
属于
学期

现在,我想查看活动的
学期中
的所有
访问
学期
表中有一个字段
处于活动状态
) 我阅读了关于find方法的contain选项,并尝试了以下方法:

$option = array(
    "contain" => array(
       "Class" => array(
          "Semester" => array(
                 "conditions" => array("Semester.is_active" => true)
           )
        ),
     ),
     "conditions" => array(
         "Visit.user_id" => $id,
         )
     );
但是有了这个,在一个不活跃的学期里的课程被发现了,只有这个学期没有


这有什么问题吗?或者还有其他方法吗?

当您使用contain时,就像在您的例子中一样,查询不是直接的内部联接,即类与学期的内部联接。 首先提取类记录,然后在学期表上进行第二次查询,查询条件为(其中class_id为IN(第一次查询的结果))。 因此,即使在学期表中没有找到任何记录,cake仍然会返回找到的课堂记录

query 1. $class = select * from classes where bla bla 
query 2. select * from semesters where class_id in (result from query 1) and other conditions bla bla
cake然后将两个查询的结果合并在一起,生成一个结果。

现在我有了一个解决方案: 我对find方法使用了
连接
选项

"joins" => array(
         array(
            "table" => "classes_semesters",
            "alias" => "ClassesSemesters",
            "type" => "inner",
            "conditions" => array(
                "Visit.class_id = ClassesSemesters.class_id"        
            )   
        ),
        array(
            "table" => "semesters",
            "alias" => "Semester",
            "type" => "inner",
            "conditions" => array(
                "ClassesSemesters.semester_id = Semester.id"        
            )       
        )
 ),
"conditions" => array(
        "Visit.user_id" => $id,
        "Semester.is_active" => true
),

所以:
访问
以下到
以下到
学期
,对吗?你可以通过学期模型进行查询……这样,你可以先提取活动学期,然后将类与结果关联,从而消除不需要的类