我开始学习PHP Code Igniter框架,我有一个非常基本的问题,我在网上找到一些好的示例代码时遇到了问题。
假设我有2个简单的数据库表(老师和学生)。每个都有唯一的标识符字段(t_id和s_id)。每个学生都有一位老师,所以学生表中有一个s_t_id字段,代表学生所在的老师。
我希望有一个屏幕,列出所有老师和他们的学生。有点像老师是一个标题,属于那个老师的学生是副标题。
我想我可以做到这一点,但我不确定这是否是正确的做法,还是更多的是黑客攻击?
我有老师和学生的模特,每个人都有一个控制器。
但是我在教师的视图中加载了它们的所有数据。所以我的老师控制器代码是这样的:
$data['teachers'] = $this->teachers_model->get_teachers();
$data['students'] = $this->students_model->get_students();
在我看来,我只是通过老师循环,让每个教师在每次迭代中让学生从传递到视图的数组中获取。
这看起来像是在MVC模式之后执行此操作的正确方法吗?或者这只是一个黑客?对于老师来说,把学生装在控制器里似乎很尴尬。
答案 0 :(得分:0)
查看sparks包(php-activerecord)
它在映射关系方面做得不错
models / 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)
));
}
}
要让它适合您,请阅读wiki php-activerecord
答案 1 :(得分: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-query解决你的问题,一些(与教师数相同)php的爆炸功能。
答案 2 :(得分:0)
数据库
学生表
id : 1
name : David
teacher_id : 2
教师表
id :1
name : Sean
id : 2
name : Rose
您的控制器 //我正在加载一个名为“view / 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>';
}
}
}
?>