2010-06-25 3 views
4

Est-ce une mauvaise pratique et dois-je être photographié pour avoir trouvé ce code?Au lieu de joindre des tables, fusionner des objets: est-ce une mauvaise pratique?

function get_business_addresses($business_id) { 

    $query = $this->db->get_where('contact_business_addr_rel', array('business_id'=> $business_id)); 

    if ($query->num_rows() > 0) { 
     foreach ($query->result() as $row) { 
      $address_id = $row->address_id; 
      $address_type_id = $row->address_type_id; 
      $this->db->select('type'); 
      $q = $this->db->get_where('contact_business_address_type',array('id'=> $address_type_id)); 

      $query = $this->db->get_where('contact_business_addresses',array('id'=> $address_id)); 

      if ($query->num_rows() > 0) { 
       foreach ($query->result() as $row) { 

        $row2 = $q->row(); 
        $obj_merged = (object) array_merge((array) $row, (array) $row2); 
        $data[] = $obj_merged; 
       } 

      } 
     } 
    } 
    return $data; 
} 
+0

J'ai ensuite redéveloppé ce code avec une jointure sql. Ce n'était pas si mal. Environ 7 lignes moins le code. –

Répondre

6

Probablement. Je ne peux pas dire avec certitude, mais il semble que cela devrait être beaucoup plus lent que d'utiliser simplement un JOIN. Je dirais que le benchmark est bien sûr, mais la règle de base est "si cela peut être fait proprement dans le SQL, le moteur DB peut probablement le faire mieux que je peux".

1

En bref, oui c'est mauvais. Pour quelques lignes (par exemple 10) cela ne fait pas beaucoup de différence. Cependant, dès que votre table arrive à avoir 10 000 lignes, cela signifie qu'elle doit d'abord aller chercher 10 000 lignes, puis faire une boucle sur chaque ligne et fusionner toutes les données. Un simple JOIN dans ce cas sera beaucoup plus vite.

Questions connexes