2011-12-27 91 views
0

我開始學習PHP代碼點火器框架,並且我有一個非常基本的問題,並且在網上找到一些很好的示例代碼時遇到問題。代碼點火器關係

比方說,我有2個簡單的數據庫表(老師和學生)。每個都有唯一的標識符字段(t_id和s_id)。每個學生都有一位老師,因此學生表中有一個s_t_id字段,代表學生擁有哪位老師。

我想要一個屏幕,其中列出所有的老師和他們的學生。有點像老師是標題,屬於那個老師的學生是副標題。

我想我可以做到這一點,但我不確定這是否是正確的方式來做到這一點,或者更多的是黑客?

我有一個老師和學生的模型,每個都有一個控制器。

但我在老師的視圖中加載了他們兩人的所有數據。所以,我的老師控制器代碼是這樣的:

$data['teachers'] = $this->teachers_model->get_teachers(); 
$data['students'] = $this->students_model->get_students(); 

在我看來,我只是環通的老師,讓學生在從傳遞到視圖的陣列中的每個迭代的每個老師。

這似乎是正確的方式來做到以下MVC模式?或者這只是一個黑客?將學生加入教師管理員似乎有些尷尬。

回答

0

退房火花包(php-activerecord

它確實映射關係

型號/ Teacher.php {型號名稱=奇異(教師),數據庫表的一份體面的工作=複數(教師)}

class Teacher extends ActiveRecord\Model 
{ 
    public static $has_many = array(array('Student')); 

    //alternative is not to include where(conditions) clause 

    public static function get_student_list($teacher_id){ 
     return (array) self::find(
         'all', array(
         'include'=>array('student'), //eager loading 
         'conditions'=>array('id=?', $teacher_id)) 
         )->students; 
    } 
} 

型號/ Student.php

class Student extends ActiveRecord\Model 
{ 
    public static $belongs_to = array(array('Teacher')); 

} 

老師控制器

class Teacher extends CI_Controller 
{ 
public function __construct(){parent::__construct();} 

public function index() 
{ 
    $this->load->view('teachers/_index', array(
      'students' => Teacher::get_student_list($this->teacher_id) 
    )); 
} 
} 

要讓它爲你工作,有一個通過維基讀php-activerecord

+0

但正如他上面提到的那樣,屏幕顯示*所有*教師與學生列在下面,所以這將做一個數據庫查詢*每個*老師,如果有1000名教師,即1000個查詢不是? (糾正我,如果我錯了!) – Hailwood 2011-12-27 23:01:49

+0

感謝您的代碼。我不知道我明白什麼數組(數組('學生'));在這兩種模式中都在做什麼? – carlg 2011-12-27 23:03:08

+0

例如他不需要調用(在視圖中)'$ teachers = Teacher :: get_all(); $ foreach($ teacher as $ teacher){$ students = Teacher :: get_student_list($ teacher-> t_id)/ *現在做迴音的東西* /}' – Hailwood 2011-12-27 23:04:29

0

我認爲,如果數據庫服務器所做的一切最好的做法是數據庫依賴性。 如果我理解正確的話,你希望類似:

Teacher1 
    Student1 
    Student2 
Teacher2 
    .... 

我想你需要類似:

SELECT teacher.name, GROUP_CONCAT(student.name) AS students 
FROM teacher 
JOIN student ON teacher.t_id=student.s_t_id 
GROUP BY teacher.t_id 

也許這個查詢是不完美的,但我認爲它會導致一些行,第一列是老師的名字,第二列是他/她的學生用逗號分隔。如果逗號不像分隔符那樣可以更改,請參閱manual

之後,您可以使用explode,這樣您就可以從指定教師的學生處獲得一個數組。

所以你可以解決你的問題,一個sql查詢和一些(與老師數相等)php的爆炸函數。

0

OKY我會做這樣的,如果我是你,

數據庫

學生表

id   : 1 
name  : David 
teacher_id : 2 

教師表

id   :1 
name  : Sean 

id   : 2 
name  : Rose 

你的控制器 //我加載名稱爲 「視圖/ index.php文件」 視圖

function index() 
{ 
    $data['teachers'] = $this->teachers_model->get_teachers(); 
    $data['students'] = $this->students_model->get_students(); 
    $this->load->view('index',$data); 
} 

您的看法

<?php 

       foreach ($teacher as $t) 
       { 
        echo 'Teacher Name:'.$t['name']; 
        echo '<br>'; 
        foreach ($students as $s) 
        { 
         if($s['teacher_id]==$t['id']) 
         { 
          echo 'Student Name:'.$s['name']; 
          echo '<br>'; 
         } 
        } 
       } 
    ?>