有两个数据表,班级表,学生表,两个表之间有关联的字段:classid
页面中显示学生列表
上面的表格中,学生的一部分数据(学号,姓名,性别,年龄)来自于学生表,另一部分数据(班级)来自于班级表,
这样的操作,涉及两个表的关联查询。
关联查询主要有三种方式:内联接,左外联接,右外联接
学生与班级之间的关联查询使用内联接,参照代码如下:
//显示所有学生列表
public function all()
{
$data = Db::name('student')
->alias('s')
->join('__BANJI__ b','s.classid=b.classid')
->field('no,name,sex,age,s.classid,b.classname')
->select();
$this->assign('student', $data);
return $this->fetch();
}
上面的代码中,alias('s')是给数据表student起别名为's',
join是两个表之间进行关联,'__BANJI__' 最终解析为 表前缀_banji,也就是说,如果banji表有前缀的话,会自动生成表前缀,另外,'__BANJI__ b'是指banji表的别名是b, 's.classid=b.classid' 是两个表的关联字段的关系
field('no,name,sex,age,s.classid,b.classname') 表示返回指定的字段,如果返回的某个字段在两个数据表之间都存在的话,必须指定表名,就像classid字段那样,student数据表和banji数据表中都有classid,那么在这里必须指定一个表名,如:s.classid
在模板中,使用volist循环二维数组,参见下面部分代码:
<h3 class="title">学生列表</h3>
<table class="table table-bordered table-hover">
<tr>
<td>学号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>班级</td>
<td>操作</td>
</tr>
<{volist name="student" id="row"}>
<tr>
<td>{$row.no}</td>
<td>{$row.name}</td>
<td>{$row.sex}</td>
<td>{$row.age}</td>
<td>{$row.classname}</td>
<td>
<a href="{:url('edit')}?no={$row.no}" class="btn btn-primary">编辑</a>
<a href="javascript:delstudent('{$row.no}')" class="btn btn-danger">删除</a>
</td>
</tr>
<{/volist}>
</table>