Итак, мне нужно найти базу данных недвижимости для всех домов, принадлежащих риэлторам, которые являются частью того же агентства недвижимости, что и нынешний риэлтор. В настоящее время я делаю это примерно так:
$agency_data = $this->Realtor->find('all',array(
'conditions'=>
array(business_name'=>$realtor_settings['Realtor']['business_name']),
'fields'=>array('num'),
'recursive'=> -1
));
foreach($agency_data as $k=>$v){
foreach($v as $k=>$v1){
$agency_nums[] = $v1['num'];
}
}
$conditions = array(
'realtor_num'=>$agency_nums
);
Мне кажется немного сумасшедшим, что мне приходится так много работать, чтобы сломать результаты моего первого запроса, просто чтобы получить простой одномерный массив идентификаторов, который я могу использовать для построения условия для мой последующий запрос. Я делаю это безумно кругом? Есть ли простой способ написать один запрос CakePHP для связи "select * from homes where realtor_num in (выбрать num из риэлторов, где business_name = 'n')"? Если да, то было бы более эффективным?
Наверняка это сложно (на вашем пути):)
В зависимости от результатов вы можете сделать следующее:
$agency_data = $this->Realtor->find('list',array(
'conditions'=>array('business_name'=>$realtor_settings['Realtor']['business_name']),
'fields'=>array('num', 'num'),
'recursive'=> -1
));
$agency_data; //this already contain array of id's
Метод 2 - построение подзапроса есть 2 пути строгий и не очень строгий:) Первый из них можно увидеть здесь (поиск для Подзапросы).
Другим вариантом является наличие следующих параметров условий:
$this->Realtor->find('all', array('conditions'=>array('field in (select num from realtors where business_name like "'.$some_variable.'"))));
Конечно, будьте осторожны с $some_variable в подзапросе. Вы избавились от него - например, используйте класс Sanitize.
$agency_data = $this->Realtor->find('all',array(
'conditions'=>
array('business_name'=>$realtor_settings['Realtor']['business_name']),
'fields'=>array('num'),
'recursive'=> -1
));
$conditions = Set::extract("{n}.Realtor.num", $agency_data);
Я бы использовал что-то вроде Set:: extract, чтобы захватить список данных, которые вы ищете. Преимущество этого заключается в том, что вы можете повторно использовать один и тот же набор данных в других местах и сохранять запросы. Вы также можете написать инструкцию set:: extract в этом формате:
$conditions = Set::extract("/Realtor/num", $agency_data);