2016-05-23 1 views
1

Ich habe 3 Tabellen nämlich - celebs, celeb_roles, celeb_industry.
celebs ist die Haupttabelle mit einer zu vielen Beziehung mit anderen 2 Tabellen.Codezeichner Getting eins zu viele Beziehung von Modell und Analyse in Sicht

celebs hat die Spalten - ID, Name, Nationalität, Status.

celebs_roles hat die Spalten - id, celeb_id, role_id.

celebs_industry hat die Spalten - id, celeb_id, industry_id.

Es gibt begrenzte und feste Anzahl von Rollen und Industrie. Also habe ich sie in eine Konfigurationsdatei mit id=>value Paar gelegt. Also, wenn ich role_id von Ergebnis bekomme, kann ich den Wert aus der Konfigurationsdatei nehmen. Gleiches gilt für industry_id.

Jetzt für einen Promi Details von einer bestimmten ID erhalten, habe ich die Abfrage wie unten im Modell geschrieben.

public function getCelebSingle($celebId) 
{ 
    $this->db->select('*'); 
    $this->db->from('celebs'); 
    $this->db->join('celebs_roles', 'celebs_roles.celeb_id = celebs.id'); 
    $this->db->join('celebs_industry', 'celebs_industry.celeb_id = celebs.id'); 
    $this->db->where('celebs_roles.celeb_id', $celebId); 
    $this->db->where('celebs_industry.celeb_id', $celebId); 
    $query = $this->db->get(); 
    return $query->result_array(); 
} 

In der Datenbank gibt es einen Datensatz in celebs, mit dem gleichen celeb_id mit 2 Datensätze in jedem anderen 2 Tabellen. Das Ergebnis, das ich bekam, ist unten.

Array 
(
    [0] => Array 
     (
     [id] => 1 
     [name] => new test 
     [nationality] => whatever 
     [status] => Pending 
     [celeb_id] => 1 
     [role_id] => 1 
     [industry_id] => 1 
    ) 

[1] => Array 
    (
     [id] => 1 
     [name] => new test 
     [nationality] => whatever 
     [status] => Pending 
     [celeb_id] => 1 
     [role_id] => 3 
     [industry_id] => 1 
    ) 

[2] => Array 
    (
     [id] => 2 
     [name] => new test 
     [nationality] => whatever 
     [status] => Pending 
     [celeb_id] => 1 
     [role_id] => 1 
     [industry_id] => 2 
    ) 

[3] => Array 
    (
     [id] => 2 
     [name] => new test 
     [nationality] => whatever 
     [status] => Pending 
     [celeb_id] => 1 
     [role_id] => 3 
     [industry_id] => 2 
    ) 
) 

Also für nur einen Datensatz von celebs Tabelle, muss ich dies in einer Schleife setzen, was meiner Meinung nach ein bisschen Überlastung ist. Wenn die Anzahl der Datensätze in anderen 2 Tabellen ansteigt, werden auch die Elemente im Ergebnis-Array erhöht. Also frage ich mich, kann ich das Ergebnis so etwas wie unten bekommen?

Array 
(
    [0] => Array 
    (
     [id] => 1 
     [name] => new test 
     [nationality] => whatever 
     [status] => Pending 
     [celeb_roles] => array(
           [0] => Array 
           (
            [id] => 1 
            [celeb_id] => 1 
            [role_id] => 1 
           ) 
           [0] => Array 
           (
            [id] => 1 
            [celeb_id] => 1 
            [role_id] => 2 
           ) 
         ) 
     [celeb_industry] => array(
           [0] => Array 
           (
            [id] => 1 
            [celeb_id] => 1 
            [industry_id] => 1 
           ) 
           [0] => Array 
           (
            [id] => 1 
            [celeb_id] => 1 
            [industry_id] => 2 
           ) 
         ) 
    ) 
) 

Dies ist nur eine Erwartung aus dem Ergebnis-Array, aber ich weiß nicht, wie dieses resultierende Array zu erreichen. Kann jemand es sich ansehen?

Hier ist ein mögliches Duplikat - Codeigniter group by and create multidimensional array. Aber die Antwort ist nicht wirklich befriedigend. Die Antworten geben eindeutig an, JOIN nicht zu verwenden, sondern normale codeigniter Abfrage zu verwenden, was meiner Meinung nach 3 Abfragen für die Frage ergeben wird. Was passiert, wenn ich alle Datensätze der Tabelle celebs auswähle? Dann ist die Anzahl der Abfragen 3 * Number of records in celebs table, die überladen wird. Wenn es keinen anderen Weg gibt, muss ich es nur so machen, aber ich hoffe, es wird bessere Wege geben, dies zu tun.

+0

möglich Duplikat: http://stackoverflow.com/questions/18745345/codeigniter-group-by-and-create-multidimensional-array – Sebastianb

Antwort

0

Bitte tun Sie dies, ich bin mir nicht sicher, ob das richtig ist, aber Sie müssen diesen Weg versuchen, wenn Sie wie erwartet im Erwartungs-Array deklarieren wollen.

$this->db->select('*'); 
    $this->db->from('celebs'); 
    $this->db->join('celebs_roles', 'celebs_roles.celeb_id = celebs.id'); 
    $this->db->join('celebs_industry', 'celebs_industry.celeb_id = celebs.id'); 
    $this->db->where('celebs_roles.celeb_id', $celebId); 
    $this->db->where('celebs_industry.celeb_id', $celebId); 
    $query = $this->db->get(); 
    $result = $query->result_array(); 
    $new_array = array(); 
    foreach ($result as $key => $value){ 
     $new_array = $value; 
      foreach ($result as $key1 => $value1){ 
       $new_array['celeb_roles'][$key1]['id'] = $value1['id']; 
       $new_array['celeb_roles'][$key1]['celeb_id'] = $value1['celeb_id']; 
       $new_array['celeb_roles'][$key1]['role_id'] = $value1['role_id']; 
      } 

    } 
+0

wirklich zu schätzen Ihre Hilfe. Ich habe das versucht. Jetzt zeigen Celeb_Roles in einem Array nach ein bisschen Modifikation, aber statt 2 celeb_roles, bekomme ich 4, da gibt es 2 Promi-Rollen und 2 Industrie. Aber ich denke, ich kann array_unique verwenden und die erforderlichen Ergebnisse erhalten. Aber ein großes Dankeschön an Sie für den Weg. – user1638279