Laravel课程表的数据库设计与实现

日常生活中常见的课程表到了PHP里确实是一个小难题,这里分享一些我设计课程表的经验,下列方式只列出大体实现方式,具体的大家要自己学习哦。

首先,我们先要搞定表结构

设计字段:id(自增) class_id:班级ID teacher_id:上课老师的ID(通过该老师能查到他的课程) day:星期几 section:第几节

字段设计好后,我们发现一周,每天按照八节课算,5天的话一共有40节课,那就要给数据库插入40条记录。楼主对比了很多方式后发现,其实这种方式除了插入的多一些,别的都比其他的方式更简单一些。

那么创建完数据表,我们就要创建我们的表格了,创建表格要求你能给表格每个格子或格子里的东西加上标识(数字),并且自己能够操控这些标识,这里$t就是我的标识,我每创建一个格子,都有他的序号,到时候操作这个序号,就是操作对应的格子。有了这个基础,你会得心应手!!!

<table border='1'>
                        <tr>
                            <th>时间</th>
                            <th>节次</th>
                            <th>周一</th>
                            <th>周二</th>
                            <th>周三</th>
                            <th>周四</th>
                            <th>周五</th>
                            <th>周六</th>
                            <th>周日</th>
                        </tr>
                        
                            
                        
                        <?php 
                            for ($i=0; $i < 8; $i++) { 
                                echo "<tr>";
                                for ($k=0; $k < 9; $k++) { 
                                    $t = $i*9+$k;
                                    if($t == $i*9+1){
                                        echo "<td>".($i+1)."</td>";
                                    }else if($t == $i*9){
                                        echo "<td>"."TIME"."</td>";
                                    }else if($t == $i*9+2){
                                         echo "<td>"."周一".$i."</td>";
                                    }else if($t == $i*9+3){
                                         echo "<td>"."周二"."</td>";
                                    }else if($t == $i*9+4){
                                         echo "<td>"."周三"."</td>";
                                    }else if($t == $i*9+5){
                                         echo "<td>"."周四"."</td>";
                                    }else if($t == $i*9+6){
                                         echo "<td>"."周五"."</td>";
                                    }else if($t == $i*9+7){
                                         echo "<td>"."周六"."</td>";
                                    }else if($t == $i*9+8){
                                         echo "<td>"."周日"."</td>";
                                    }

                                   
                                    
                                }
                                echo "</tr>";
                            }


                         ?>
</table>

接下来,我们设计创建课程表的表单,teachers我是从后台拿到老师然后传到模版,别忘了把class_id也传过来!

  <form action="{{ URL('schedule') }}" method="POST" enctype="multipart/form-data">
                        <input type="hidden" name="_token" value="{{ csrf_token() }}">
                        <input type="hidden" name="class_id" value='{{$classid}}'>
                        <table border='1'>
                            <tr>
                                <th>时间</th>
                                <th>节次</th>
                                <th>周一</th>
                                <th>周二</th>
                                <th>周三</th>
                                <th>周四</th>
                                <th>周五</th>
                                <th>周六</th>
                                <th>周日</th>
                            </tr>
                            
                                
                            
                            <?php 

                                for ($i=1; $i <= 8; $i++) {
                                    
                                    $w[$i] = "w".$i; 
                                    echo "<tr>";
                                    for ($k=0; $k < 9; $k++) { 
                                        $t = $i*9+$k;
                                        $sd = 'sd'.$t;//每个select上的坐标,section day简写
                                        if($t == $i*9+1){
                                            echo "<td>".($i)."</td>";
                                        }else if($t == $i*9){
                                            echo "<td>".$time[$w[$i]]."</td>";
                                        }else if($t == $i*9+7 || $t==$i*9+8){
                                            echo "<td>休息</td>";
                                        }else {
                                             echo "<td>";
                                             echo "<select name=".$sd.">";
                                             echo "<option value='1'>请选择</option>";
                                             foreach($teachers as $t){
                                                 echo "<option value=".$t['value'].">";
                                                 echo $t['name'];
                                                 echo "</option>";
                                             }
                                            
                                             echo "</select>";
                                             echo "</td>";
                                       
                                        }

                                       
                                        
                                    }
                                    echo "</tr>";
                                }


                             ?>
                        </table>
                        <input type="submit" value="保存" class='btn btn-success'>
                    </form>

然后我们有遇到了难题,怎么存储呢?其实就是根据你的格子序号来操作的,不同的序号对应不同的星期和节次,规律很好找!

public function store(Request $request){
        $exist = Schedule::where("class_id",Input::get('class_id'))->first();
        if($exist){
            return Redirect::back()->withInput()->withErrors(ClassToGrade(Input::get('class_id')).'已有课程表,只允许修改,不允许重复创建');
            return false;
        }else{

            for($i = 1;$i<=79;$i++){
                $sd = 'sd'.$i;
                if(!Input::get($sd) || Input::get($sd)==0 || Input::get($sd)==''){

                }else{
                    $schedule = new Schedule;

                    if($i%9 ==2){     //计算周是周几
                        $schedule->days = 1; //周一
                    }else if($i%9 == 3){
                        $schedule->days = 2; //周二
                    }else if($i%9 == 4){
                        $schedule->days = 3; //周三
                    }else if($i%9 == 5){
                        $schedule->days = 4; //周四
                    }else if($i%9 == 6){
                        $schedule->days = 5; //周五
                    }else{

                    }

                    if($i>= 11 && $i<=15){ //计算是第几节
                        $schedule->section =1;
                        $schedule->teacher_id = Input::get($sd);
                    }else if($i>=20 && $i<=24){
                        $schedule->section =2; 
                        $schedule->teacher_id = Input::get($sd);     
                    }else if($i>=29 && $i<=33){
                        $schedule->section =3; 
                        $schedule->teacher_id = Input::get($sd);     
                    }else if($i>=38 && $i<=42){
                        $schedule->section =4;
                        $schedule->teacher_id = Input::get($sd);      
                    }else if($i>=47 && $i<=51){
                        $schedule->section =5;
                        $schedule->teacher_id = Input::get($sd);      
                    }else if($i>=56 && $i<=60){
                        $schedule->section =6; 
                        $schedule->teacher_id = Input::get($sd);     
                    }else if($i>=65 && $i<=69){
                        $schedule->section =7; 
                        $schedule->teacher_id = Input::get($sd);     
                    }else if($i>=74 && $i<=78){
                        $schedule->section =8;
                        $schedule->teacher_id = Input::get($sd);      
                    }else{
                        
                    }                                
                    
                    $schedule->class_id = Input::get('class_id');
                    $schedule->save(); 
                }
            }

         return Redirect::back()->withInput()->withErrors(ClassToGrade(Input::get('class_id')).'课表创建成功');
           
        }
    }

创建好了,那么,修改时候,我想要选好的课程就在那,不用再次点选,怎么让选框默认选好我选中的课程呢?毕竟我的记录有40条。。那我们就要设置一个自增的key(我这里叫做$s),让他从0增加到39(一共40个)

首先,跳转到修改页:

public function edit($id){
        $class_id = $id;
        $time = CourseTime::where("school_id",userSchool())->first();
        $teachers = ClassTeacher::where("class_id",$class_id)->get();

        foreach($teachers as $key=>$t){
                    $teacher[$key]['value'] = $t->teacher_id;
                    $teacher[$key]['name'] = TeacherToCourse($t->teacher_id).":".TeacherConvert($t->teacher_id);
        }

        $schedules = Schedule::where("class_id",$class_id)->get();
        $k = 1;
        foreach($schedules as $s){
            
            $schedule[$k]['value'] = $s->teacher_id;
            $schedule[$k]['name'] = TeacherToCourse($s->teacher_id).":".TeacherConvert($s->teacher_id);
            $k++;

        }
        
       
        return view("home.schedule.edit")
            ->withClassid($class_id)
            ->withTime($time)
            ->withTeachers($teacher)
            ->withSchedules($schedule);
    }

接下来,模版里面:

<table border='1'>
                            <tr>
                                <th>时间</th>
                                <th>节次</th>
                                <th>周一</th>
                                <th>周二</th>
                                <th>周三</th>
                                <th>周四</th>
                                <th>周五</th>
                                <th>周六</th>
                                <th>周日</th>
                            </tr>
                            
                                
                            
                            <?php 
                                $s = 1; //课程计数,这里从1开始是因为我跳转修改页时设置的第一项是1
                                for ($i=1; $i <= 8; $i++) {
                                    
                                    $w[$i] = "w".$i; 
                                    echo "<tr>";
                                    for ($k=0; $k < 9; $k++) { 
                                        $t = $i*9+$k;
                                        $sd = 'sd'.$t;//每个select上的坐标,section day简写
                                        if($t == $i*9+1){
                                            echo "<td>".($i)."</td>";
                                        }else if($t == $i*9){
                                            echo "<td>".$time[$w[$i]]."</td>";
                                        }else if($t == $i*9+7 || $t==$i*9+8){
                                            echo "<td>休息</td>";
                                        }else { //进来这里s才会增加,因为40节课所以进来40次,所以s一共增加40次,对应40条记录
                                             echo "<td>";
                                             echo "<select name=".$sd.">";
                                            
                                             foreach($teachers as $t){
                                                
                                                    
                                                if( $t['value'] == $schedules[$s]['value']){  //<span style="font-family: Arial, Helvetica, sans-serif;">让每条记录去匹配选项里的老师的id,如果一样就selected</span>

                                                    echo "<option selected value=".$t['value'].">"; 
                                                    echo $t['name'];
                                                    echo "</option>";
                                                }else{
                                                    echo "<option value=".$t['value'].">";
                                                    echo $t['name'];
                                                    echo "</option>"; 
                                                }
        
                                               
                                                 
                                             }
                                            
                                             echo "</select>";
                                             echo "</td>";

                                             $s++;
                                       
                                        }

                                       
                                        
                                    }
                                    echo "</tr>";
                                }


                             ?>
                        </table>
                        <input type="submit" value="保存" class='btn btn-success'>
                    </form>


怎么保存修改的结果呢,最简单的办法是把原来的删除重建,但我们不想这样,就想把里面的数据改一下

public function update(Request $request){
        //最简单的方法是删除原来的重新建一个,没有之一,但我们这里还是去修改数据
            $class_id = Input::get('class_id');
            $schedules = Schedule::where('class_id',$class_id)->get();//把那40条数据找出来
            $k=0;
                for($i = 1;$i<=79;$i++){
                    $sd = 'sd'.$i;
                    if(!Input::get($sd) || Input::get($sd)==0 || Input::get($sd)==''){

                    }else{

                        $schedules[$k]->teacher_id = Input::get($sd); //传40个值,所以进来40次,第一个传给$k=0的,下一个传给$k=1的,以此类推,逐条完成修改
                        $schedules[$k]->save();
                        $k++;
 
                    }                                 
                }

         return Redirect::back()->withInput()->withErrors(ClassToGrade(Input::get('class_id')).'课表修改成功');
           
        
    }







版权声明:本文为amazingdyd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。