php中查询记录的实现过程,首页查询功能的一次实现过程

本次的目的是完成学生选课系统的首页查询功能的实现,

具体要求:

1.在首页显示当前周的课表。

2.显示所有的学生每节课的有无情况。

效果图如下

bVbnM7e?w=1200&h=704

初始思路:

1.查询当前学期的所有课程

2.查询本周,周几,第几节课的课程id

3.通过课程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"}

周次

{volist name="periods" id="period"}

{$period.name}

{/volist}

{volist name="days" id="day"}

{$day.name}

{volist name="periods" id="period"}

{volist name="students" id="student"}

{$student.name}&nbsp{eq name="$student->getHasCourse($student.id,$day.id,$period.id)" value="true"}有课{else /}无课{/eq}

{/volist}

{/volist}

{/volist}

{/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循环都没有用到。

总结

这次的首页查询功能,让我更多的了解到了面向对象的思想,但是老师讲出来之后明白了和自己本身就有的还是不一样的。

思想转变不是那么的容易,还需要多加练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值