Запрос к базе данных CakePHP - я слишком усложняю вещи? - PullRequest
0 голосов
/ 21 сентября 2010

Итак, мне нужно найти в базе данных по недвижимости все дома, принадлежащие риэлторам, которые являются частью того же агентства недвижимости, что и текущий риэлтор. В настоящее время я делаю это примерно так:

$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 для сообщения «выберите * из домов, где находится realtor_num (выберите num из риэлторов, где business_name = 'n')»? Если это так, будет ли это более эффективным?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2010
$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);
0 голосов
/ 21 сентября 2010

Конечно, это сложно (по-вашему):)

В зависимости от результатов вы можете сделать следующее:

 $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 - создание подзапроса, есть два способа строгойи не так строго :) Первое, что вы можете увидеть здесь (поиск по Подзапросам ).

Другой вариант - иметь следующий параметр условий:

$this->Realtor->find('all', array('conditions'=>array('field in (select num from realtors where business_name like "'.$some_variable.'"))));

Конечно, будьте осторожны с $ some_variable в подзапросе.Вы должны избежать этого - используйте, например, класс Sanitize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...