首頁查詢功能的一次實現過程

本次的目的是完成學生選課系統的首頁查詢功能的實現,數據庫

具體要求:

1.在首頁顯示當前周的課表。
2.顯示全部的學生每節課的有無狀況。數組

效果圖以下

clipboard.png

初始思路:

1.查詢當前學期的全部課程
2.查詢本週,周幾,第幾節課的課程id
3.經過課程id查詢有那些學生選擇了該課程
4.將查詢到的學生id設爲有課,其他爲無課,並將數據傳輸到V層fetch

依照以上方法,實現的時候才發現很複雜,並且因爲多層查詢須要用循環套循環的方法,
因此最後代碼不但很長,並且出了一點錯誤就很難改過來,把本身繞了進去this

// 獲取數據庫信息,並傳到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();
    }

這部分代碼雖然實現了功能,可是明顯不是老師要得效果,主要是沒有面向對象的思想,
所以,後面老師講了一種面向對象的思想spa

老師講的思路:

1.首先設立三個數組:周幾,第幾節,學生。這三個數組分別有一個name一個id屬性
2.將數組數據傳輸到V層,並顯示
3.利用這三項數據,調用一個getHasCourse的方法,直接查詢學生是否有課,並返回true或falusecode

按照以上思路,發現事情變得很簡單。對象

首先,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}&nbsp{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,節次idblog

最後,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循環都沒有用到。ip

總結

此次的首頁查詢功能,讓我更多的瞭解到了面向對象的思想,可是老師講出來以後明白了和本身自己就有的仍是不同的。
思想轉變不是那麼的容易,還須要多加練習。get

相關文章
相關標籤/搜索