2011-12-27 88 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>'; 
         } 
        } 
       } 
    ?>