本次的目的是完成学生选课系统的首页查询功能的实现,具体要求: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循环都没有用到。总结这次的首页查询功能,让我更多的了解到了面向对象的思想,但是老师讲出来之后明白了和自己本身就有的还是不一样的。思想转变不是那么的容易,还需要多加练习。