2013-04-16 5 views
0

У меня возникли проблемы с возвратом значений из модели в контроллер с помощью CodeIgniter. Я передаю два массива от контроллера к модели. Я проверяю, не являются ли обе массивы пустыми и их цикл с использованием цикла foreach для извлечения некоторых значений из базы данных и возврата запроса к контроллеру. Вот мой текущий код
Возвращаемое значение в цикле foreach в CodeIgniter

if (!empty($search_for_area) && !empty($search_for_requirement)) 
     { foreach($search_for_requirement as $search_value_1) 
      { 
      foreach($search_for_area as $search_value_2) 
       { 
       if($search_value_2 != null && $search_value_1 != null) 
        { 
        $nearbytution = $this->db->query('select name,area,contactno from tut_listing where area = "'.$search_value_2.'" and categoryfilter like "%'.$search_value_1.'%" and partner > "" group by name'); 
        print_r($nearbytution->result()); 
        } 
       } 
      } 

     //Line 1 
     } 

print_r($nearbytution->result()); работает отлично и я могу просмотреть результаты. Где я должен положить return $nearbytution;, чтобы я мог получить все выбранные значения? Я попробовал его в Line 1, но я получал только значения последнего значения массива.

ответ

2
function returnStuff($search_for_area,$search_for_requirement) { 
    $arr_area = array(); 
    $arr_filter = array(); 
    if (! empty($search_for_area) and ! empty($search_for_requirement)) { 
     foreach($search_for_requirement as $search_value_1) { 
      foreach($search_for_area as $search_value_2) { 
       if($search_value_2 != null && $search_value_1 != null) { 
        $arr_area[] = $this->db->escape($search_value_2); 
        $arr_filter[] = $this->db->escape_like_str($search_value_1); 
       } 
      } 
     } 
    } 

    $str_area = 'NULL'; 
    if ($arr_area) 
     $str_area = implode(', ', $arr_area); 

    $str_filter = "'^-$'"; 
    if ($arr_filter) 
     $str_filter = "'(".implode('|', $arr_filter).")'"; 

    $query = $this->db->query(" 
     SELECT name, area, contactno 
     FROM tut_listing 
     WHERE area IN ({$str_area}) AND categoryfilter REGEXP {$str_filter} and partner > '' group by name 
    "); 

    return $query->result(); 
} 

Серьезно, рассмотрите этот подход. Вам нужно только беспокоить плохой сервер Mysql одним звонком, и вы получаете все нужные данные одновременно.

Помимо этого, соблюдайте согласованный стиль в своем коде. Это сэкономит ваше время и ваши волосы в долгосрочной перспективе.

+0

спасибо .. Это должно сделать трюк ..:) Даже мне было интересно, было ли целесообразно ударить по серверу Mysql со многими вызовами. К счастью, ваш ответ также охватывает это. –

0

Попробуйте это в цикле:

$nearbytution[] = $this->db->query('select name,area,contactno from tut_listing where area = "'.$search_value_2.'" and categoryfilter like "%'.$search_value_1.'%" and partner > "" group by name')->result(); 

return $nearbytution; могут быть помещены в ваш "Линия 1". Он будет содержать массив результатов запроса.

+0

(Тем не менее, я чувствую, что я должен добавить, что запрашивая внутри цикла не совсем хорошая практика ...) – Mudshark

0

Если я не понял ваш вопрос, почему бы вам просто не сохранить все результаты в большом массиве, а затем вернуть этот массив?

function returnStuff($search_for_area,$search_for_requirement) { 
    $data = array(); 
    if (!empty($search_for_area) && !empty($search_for_requirement)) {    
     foreach($search_for_requirement as $search_value_1) { 
     foreach($search_for_area as $search_value_2) { 
      if($search_value_2 != null && $search_value_1 != null) { 
       $nearbytution = $this->db->query('select name,area,contactno from tut_listing where area = "'.$search_value_2.'" and categoryfilter like "%'.$search_value_1.'%" and partner > "" group by name'); 
       $data[] =$nearbytution->result()); 
       } 
      } 
     } 
    } 
    return $data; 
} 

Теперь данные $ будут представлять собой массив результатов, каждый из которых содержит результаты запроса. Если ваш результирующий набор необходимо очистить (например, для удаления дубликатов), вы можете просто пропустить его и выполнить эту очистку.

Возможно, вы также можете создать большой SQL-запрос в своих циклах foreach, а затем просто сделать этот один большой запрос и вернуть результаты.

Смежные вопросы