我有一个包含Classes
、Semesters
、Users
和Visits
的数据库(Visits
是Users
和Classes
的联接表)关系是:
User
拥有并属于许多Class
(通过访问Class
属于Semester
现在我想查看活动的Semester
中所有具有Classes
的Visits
(Semester
表有一个字段is_active
)我读到了find方法的包含选项,并尝试了这样的方法:
$option = array(
"contain" => array(
"Class" => array(
"Semester" => array(
"conditions" => array("Semester.is_active" => true)
)
),
),
"conditions" => array(
"Visit.user_id" => $id,
)
);
但有了这一点,就可以找到一个不活跃学期的课程,只有这个学期没有。
这个有什么问题吗?或者还有别的办法吗?
现在我有了一个解决方案:我在查找方法中使用了joins
选项。
"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
),
当您使用contain时,就像在您的案例中一样,查询不是直接的内部联接,即使用Semester的class内部联接。首先提取类记录,然后在学期表上进行第二次查询,条件为(其中class_id IN(第一次查询的结果)。因此,即使在学期表中没有找到任何记录,蛋糕仍然会返回找到的班级记录。
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然后将来自2个查询的结果合并在一起以产生1个结果。