ThinkPHP5数据库实例详解 /table与setTable方法

table与setTable方法

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、适用环境:

  • 需要完整的数据表名称(如某张表前缀与系统配置不一致或没有设置前缀);
  • 需要跨越数据库,选择其它库中的数据表操作时;
  • 需要给当前数据表设定别名访问,以避免与关键字冲突,特别是多表查询时;

重要提示: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( ) ) ;

为了代码清晰,健壮易扩展,不建议用setTable来牺牲灵活性

5、调用语法(以:tp5_staff表为例):

  • 通过 Db.php类中的:static _callStatic() 自动实现静态方法调用(了解即可)
  • 数据库类静态调用:
    • 完整数据表名称:Db::table('tp5_staff');
    • 带数据库名称的完整数据表:Db::table('tp5.tp5_staff');
    • 给数据表设置别名调用:Db::table(['tp_staff'=>'staff']);

6、实例:

dump( )方法介绍:

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'));
  1. (带数据库的完整表名)选择tp5_staff表,查询id等于1003的数据
dump(Db::table('tp5.tp5_staff')->find('1003'));
  1. (设置表别名)选择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()替代;
  • 日常开发中,完全可以用模型调用方式,避免用这种方式。

小作业:

  • 课后,把本课的实例全部上机操作一遍,以加深理解。