TP中涉及到多表查询数据时候一般来使用Model模型层。在对模型文件命名的时候本人习惯与遵循一下方案以便于在看到文件名称的时候就能够很方便的知道那些文件是表单模型、多表操作模型以及视图模型:
1,只有单表操作的时候的命名,例如:UserModel.class.php。
2,有多表关联操作的时候的命名,例如:UserRelationModel.class.php。
3,有视图模型的时候的命名,例如:UserViewModel.class.php
以下是一个Model模型层的参考文件:
<?php
namespace Admin\Model;
use Think\Model\RelationModel;
/**
* 用户表于角色表关联模型
*/
class UserRelationModel extends RelationModel {
//定义主表的名称,如果命名方式是UserModel则不用定义此项,系统默认取Model前面的字符为主表名称
protected $tableName = 'user';
protected $_link = array(
//定义于从表的关联参数
'role' => array(
'mapping_type' => self::MANY_TO_MANY, //映射类型多对多
'foreign_key' => 'user_id', //主表关联外键
'relation_foreign_key' => 'role_id', //从表关联外键
'relation_table' => 'hd_role_user', // 此处应显式定义中间表名称,且不能使用 C 函数读取表前缀
'mapping_fields' => 'id, name, remark' //需要读取的关联字段
)
);
}
注:ThinkPHP的field()方法小技巧:
1)例如读取数据库的字段有id, name, password, logintime,但是除了password不需要读取其他的都读取的话一般是这样写field(array('id', 'name', 'logintime'))但是这样写太长而且不够优雅,可以更改为这样:field('password', true)效果和前者一样,但是看起来美观多了。
2)在模板输出的时候经常会用到循环,如果输出多维数组的话就需要循环里面套循环。需要注意的是第二层循环的取第一层循环的item里的下表的时候不要加$符号,要不然不会输出第二层循环的值,如图所示: