[TOC] ## table方法的使用 #### 1、功能:选择当前操作的数据表实例(完整表名) #### 2、源码位置:/thinkphp/library/think/db/Query.php ~~~ /** * 指定当前操作的数据表 * @access public * @param mixed $table 表名 * @return $this */ public function table($table) { if (is_string($table)) { if (strpos($table, ',')) { $tables = explode(',', $table); $table = []; foreach ($tables as $item) { list($item, $alias) = explode(' ', trim($item)); if ($alias) { $this->alias([$item => $alias]); $table[$item] = $alias; } else { $table[] = $item; } } } elseif (strpos($table, ' ')) { list($table, $alias) = explode(' ', $table); $table = [$table => $alias]; $this->alias($table); } } else { $tables = $table; $table = []; foreach ($tables as $key => $val) { if (is_numeric($key)) { $table[] = $val; } else { $this->alias([$key => $val]); $table[$key] = $val; } } } $this->options['table'] = $table; return $this; } ~~~ #### 3、参数与返回值: * 阅读源码发现: * 参数只有一个:数据表名称 ,而且必须是完整的、包括表前缀; * 参数可以指定数据库名称,实再跨库选择数据表; * 返回的是查询类Query的对象自身,便于后面链式调用。 #### 4、适用环境: * 需要完整的数据表名称(如某张表前缀与系统配置不一致或没有设置前缀); * 需要跨越数据库,选择其它库中的数据表操作时; * 需要给当前数据表设定别名访问,以避免与关键字冲突,特别是多表查询时; >[danger] 重要提示:setTable方法功能与table非常类似,但还是有区别的: 1、table方法指定当前正在操作的数据表; 2、setTable方法设置当前脚本默认的数据表; 3、即当前脚本中,如果用setTable设置了默认数据表,那么后面语句就不用再次调用table了。 ~~~ //设置了默认数据表为:setTable( 'tp5_staff' ),后面的操作都针对该表 dump( Db::setTable( 'tp5_staff' ) -> where( 'id = 1020' ) -> find( ) ) ; //查询 id= 1025的记录,不用再设置数据表了 dump( Db:: where( 'id = 1020' ) -> find( ) ) ; ~~~ >[warning] 为了代码清晰,健壮易扩展,不建议用setTable来牺牲灵活性 #### 5、调用语法(以:tp5_staff表为例): * <span style="color:#999;">通过 Db.php类中的:static _callStatic() 自动实现静态方法调用(了解即可)</span> * 数据库类静态调用: * 完整数据表名称:Db::table('tp5_staff'); * 带数据库名称的完整数据表:Db::table('tp5.tp5_staff'); * 给数据表设置别名调用:Db::table(['tp_staff'=>'staff']); #### 6、实例: **dump( )方法介绍:** >[success] 1.dump( )方法是框架提供给开发者的一个非常好用的调式工具,可以对运行结果中的数据进行人性化的展示,可以认为是PHP原生var_dump( )函数加强版,或者格式化的var_dump( ); 2.dump( ) 方法,定义在:/thinkphp/library/think/Debug.php 类中,该类随框架启动,所以你可以直接使用dump( ) 3.如果你这样使用:Debug::dump( ) 也可以,但必须在脚本前面引入Debug.php类文件 ,即:use think\Debug; 1. (完整表名)选择tp5_staff表,查询id等于1003的数据 * 为节省篇幅,只列出方法中关键语句,相信你完全可以自己补全: ~~~ dump(Db::table('tp5_staff')->find('1003')); ~~~ 2. (带数据库的完整表名)选择tp5_staff表,查询id等于1003的数据 ~~~ dump(Db::table('tp5.tp5_staff')->find('1003')); ~~~ 3. (设置表别名)选择tp5_staff表,查询id等于1003的数据 ~~~ dump(Db::table(['tp5.tp5_staff'=>'staff'])->find('1003')); ~~~ * 运行结果: ~~~ array(7) { ["id"] => int(1003) ["name"] => string(6) "杨过" ["sex"] => int(0) ["age"] => int(35) ["salary"] => float(5303) ["dept"] => string(9) "市场部" ["hiredate"] => string(10) "2014-09-22" } ~~~ * 参数说明 * 将参数放在一个数组中,每个数据元素,对应一个数据表; * 原始完整表名做为数据元素键名,别名做为数据元素的值; * 多表联合查询时,设置表别名非常重要,特别是表自身递归查询时。 #### 7、局限性或注意事项: * table()方法,对数据表名要求比较严格,不够简洁; * 如果在数据库连接配置中设置了表前缀,完全可以用后面要学的name()替代; * 日常开发中,完全可以用模型调用方式,避免用这种方式。 #### 小作业: * 课后,把本课的实例全部上机操作一遍,以加深理解。