本次的目的是完成学生选课系统的首页查询功能的实现,
具体要求:
1. 在首页显示当前周的课表。2. 显示所有的学生每节课的有无情况。
效果图如下
初始思路:
1. 查询当前学期的所有课程 2. 查询本周,周几,第几节课的课程 id3. 通过课程 id 查询有那些学生选择了该课程 4. 将查询到的学生 id 设为有课,其余为无课,并将数据传输到 V 层
依照以上方法,实现的时候才发现很复杂,而且由于多层查询需要用循环套循环的方法,所以最后代码不但很长,而且出了一点错误就很难改过来,把自己绕了进去
// 获取数据库信息,并传到V层显示。
public function index() {
// 查询当前学期
$term = Term::where(‘state’,1)->find();
// var_dump($term->id);
// 获取当前学期的所有课程
$courseId = Course::where(‘term_id’,$term->id)->column(‘id’);
// var_dump($courseId);
// 获取本周的课程
$classTime = ClassTime::where([‘course_id’ => $courseId])->select();
// var_dump($classTime);
// var_dump(strtotime(date(‘Y-m-d’)));
// var_dump(strtotime($term[0][‘start_time’]));
$week = intval((strtotime(date(‘Y-m-d’)) – strtotime($term->start_time))/7/86400);
// var_dump($week);
$classTime = $classTime->where(‘week’,$week);
// var_dump($classTime);
$studentName = Student::where(‘state’,1)->column(‘name’);
// var_dump($studentName);
for ($j=0; $j < 7; $j++) {
for ($i=0; $i < 5; $i++) {
$num = count($studentName);
// var_dump($studentName[0]);
for ($k=0; $k < $num; $k++) {
$home = new Home;
$home->day = $j+1;
$home->period = $i+1;
$home->name = $studentName[$k];
$home->state = 0;
if (!is_null($classTime)) {
$classTime = $classTime->where(‘day’,$j+1);
$classTime = $classTime->where(‘period’,$i+1);
// var_dump($classTime);
// 获取学生 Id
$stuCoursId = StudentCourses::where([‘courses_id’ => $classTime->column(‘course_id’)])->column(‘student_id’);
$stuState = Student::where([‘id’ => $stuCoursId])->column(‘state’);
// var_dump($home);
// var_dump($stuState[0]);
if (!is_null($stuCoursId) && in_array(1, $stuState)) {
$stuName = Student::where([‘id’ => $stuCoursId],[‘state’,1])->column(‘name’);
// var_dump($stuName);
// $home->save();
if (!is_null($home->where([‘name’ => $stuName])->find())) {
$home->where([‘name’ => $stuName])->find()->state = 1;
}
}
}
$lists[$j][$i][$k] = $home;
}
// var_dump($home);
}
// var_dump($home);
}
$week = [‘ 周一 ’,’ 周二 ’,’ 周三 ’,’ 周四 ’,’ 周五 ’,’ 周六 ’,’ 周日 ’];
var_dump($lists[0][0][0]);
// var_dump($list);
$this->assign(‘week’,$week);
$this->assign(‘lists’,$lists);
return $this->fetch();
}
这部分代码虽然实现了功能,但是明显不是老师要得效果,主要是没有面向对象的思想,因此,后面老师讲了一种面向对象的思想
老师讲的思路:
1. 首先设立三个数组:周几,第几节,学生。这三个数组分别有一个 name 一个 id 属性 2. 将数组数据传输到 V 层,并显示 3. 利用这三项数据,调用一个 getHasCourse 的方法,直接查询学生是否有课,并返回 true 或 faluse
按照以上思路,发现事情变得很简单。
首先,C 层的查询并建立两个关于周次和节次的数组
public function index() {
// 先查询非冻结状态的学生
$student = Student::where(‘state’,1)->select();
$this->assign(‘students’,$student);
// 设置循环显示的周次
$day = array(array(‘id’=>’1′,’name’=>’ 周一 ’),
array(‘id’=>’2′,’name’=>’ 周二 ’),
array(‘id’=>’3′,’name’=>’ 周三 ’),
array(‘id’=>’4′,’name’=>’ 周四 ’),
array(‘id’=>’5′,’name’=>’ 周五 ’),
array(‘id’=>’6′,’name’=>’ 周六 ’),
array(‘id’=>’7′,’name’=>’ 周日 ’)
);
// 设置节次,并设置好 id,方便与数据库中的数据对接
$period = array(array(‘id’=>’1′,’name’=>’ 第一节 ’),
array(‘id’=>’2′,’name’=>’ 第二节 ’),
array(‘id’=>’3′,’name’=>’ 第三节 ’),
array(‘id’=>’4′,’name’=>’ 第四节 ’),
array(‘id’=>’5′,’name’=>’ 第五节 ’)
);
$this->assign(‘days’,$day);
$this->assign(‘periods’,$period);
return $this->fetch();
}
然后,V 层显示数据
{extend name=”index” /}
{block name=”content”}
<div class=”row”>
<div class=”col-md-offset-1 col-md-10″>
<table class=”table table-bordered”>
<tr class=”info”>
<td> 周次 </td>
{volist name=”periods” id=”period”}
<td>{$period.name}</td>
{/volist}
</tr>
{volist name=”days” id=”day”}
<tr>
<td class=”info”>{$day.name}</td>
{volist name=”periods” id=”period”}
<td>
{volist name=”students” id=”student”}
{$student.name} {eq name=”$student->getHasCourse($student.id,$day.id,$period.id)” value=”true”}<label style=”color: red;”> 有课 </label>{else /}<lable> 无课 {/eq}</label>
<br />
{/volist}
</td>
{/volist}
</tr>
{/volist}
</table>
</div>
</div>
{/block}
其中的 eq 里面就是调用的 getHasCourse 方法,该方法写在 M 层里面,传入的参数为学生 id,周次 id,节次 id
最后,M 层的方法:
public function getHasCourse($studentId,$dayId,$periodId) {
// 查询当前学期,找到开始时间
$term = Term::where(‘state’,1)->find();
// 计算现在是第几周
$week = intval((strtotime(date(‘Y-m-d’)) – strtotime($term->start_time))/7/24/60/60)+1;
// 查询本周的课程
$courseId = ClassTime::where(‘day’,$dayId)->where(‘period’,$periodId)->where(‘week’,$week)->column(‘course_id’);
// 查询当前学生在当前周次, 节次是否有课。
$count = count(StudentCourses::where([‘courses_id’=>$courseId])->where(‘student_id’,$studentId)->find());
// 有课则大于 0;
if ($count > 0) {
return ‘true’;
} else {
return ‘faluse’;
}
}
经过这么写,发现思路很清晰,每层的功能也能很明白的了解到,而且代码也并不复杂,甚至一个 for 循环都没有用到。
总结
这次的首页查询功能,让我更多的了解到了面向对象的思想,但是老师讲出来之后明白了和自己本身就有的还是不一样的。思想转变不是那么的容易,还需要多加练习。