2013-11-18 6 views
0

у меня есть база данных с Classes, Semesters, Users и Visits (Visits является объединением столом для Users и Classes) отношений являются:CakePHP условия в связанных моделях

User hasAndBelongsToMany Class (через Визиты Class belongsTo Semester

Сейчас я хочу просмотреть все Visits с Classes в активном Semester (таблица Semester имеет поле is_active) Я читал об опции содержат для метода найти и пытался что-то вроде этого:

$option = array(
    "contain" => array(
     "Class" => array(
      "Semester" => array(
       "conditions" => array("Semester.is_active" => true) 
      ) 
     ), 
    ), 
    "conditions" => array(
     "Visit.user_id" => $id, 
     ) 
    ); 

Но с этим, занятия в не активном семестре найдены, только семестр нет.

С этим что-то не так? Или есть другой способ?

+0

так: 'Посещения' принадлежит классам и классу принадлежит' Семестру', правильно? – arilia

+0

yes thats right – SPie

ответ

0

Когда вы используете содержать, как и в вашем случае, запрос не является прямым внутренним соединением, то есть внутренним соединением класса с семестром. сначала записываются записи классов, тогда будет второй запрос в таблице семестров с условием (где 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 

торта затем сливает результат из 2 запросов вместе, чтобы произвести 1 результат

+0

и как я могу решить эту проблему? – SPie

+0

вы можете пройти семестровую модель для своего запроса ... таким образом, сначала вы извлекаете активные семестры, а затем классы соединяются с результатом, следовательно, устраняя нежелательные классы –

1

Теперь у меня есть решение: я использовал 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 
), 
Смежные вопросы