在ThinkPHP 5.0中,可以使用模型关联的方式来管理a表和b表,其中a表和b表通过order_id字段进行关联。假设a表对应的模型是A,b表对应的模型是B,order_id字段是它们之间的关联字段,可以按照以下步骤进行管理:
定义A模型和B模型,并在模型中定义它们之间的关联关系。
// A模型
namespace app\common\model;
use think\Model;
class A extends Model
{
// 定义与B模型的关联关系
public function b()
{
return $this->belongsTo('B', 'order_id');
}
}
// B模型
namespace app\common\model;
use think\Model;
class B extends Model
{
// 定义与A模型的关联关系
public function a()
{
return $this->hasOne('A', 'order_id');
}
}在需要使用关联查询的地方,可以使用with方法来进行关联查询,并通过匿名函数定义需要查询的字段。
use app\common\model\A;
$aList = A::with(['b' => function($query){
$query->field('id,name');
}])->select();这样就可以查询出A表的数据,并且同时关联查询出B表的数据,且只查询B表中的id和name字段。
上面要注意关联里面查询的字段要有关联字段,如id。
学习thinkphp有半个月多了,首先入门的是做一个博客系统,跟着老师的教学,把原生的blog改成tp版的blog系统,之后用tp做了一个类似商业的网站(六堡茶官网),对thinkphp更深入的学习了一番。
总的来说这个框架学起来还是蛮容易接受的,学习框架对于程序的开发来说缩短了周期,简化了操作步骤。
比如输入直接是:
I('post.name','','htmlspecialchars')
单字母函数比如I、D、U、A、M等,使用起来非常方便。
链接数据库可以用数组直接:
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'thinkphp', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '123456', // 密码
'DB_PORT' => 3306, // 端口
'DB_PREFIX' => 'think_', // 数据库表前缀
'DB_CHARSET'=> 'utf8', // 字符集
'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增
简单设置就可以愉快的进行网站开发了。
实例化数据表可以直接用D函数,模型调用方便。
对数据进行分页是一个专题,当时卡了将近一天,后来发现了问题所在。
$User = M('User'); // 实例化User对象
$count = $User->where('status=1')->count();// 查询满足要求的总记录数
$Page = new \Think\Page($count,25);// 实例化分页类 传入总记录数和每页显示的记录数(25)
$show = $Page->show();// 分页显示输出
// 进行分页数据查询 注意limit方法的参数要使用Page类的属性
$list = $User->where('status=1')->order('create_time')->limit($Page->firstRow.','.$Page->listRows)->select();
$this->assign('list',$list);// 赋值数据集
$this->assign('page',$show);// 赋值分页输出
$this->display(); // 输出模板
这里注意$Page这个变量不可以和系统冲突,否则不会成功。
然后上传功能也是一个主题,当时还是得出现了很多问题,要么是没有提示,要么是提示目录问题,提示非法问题。
发现需要在form里面添加属性
<form action="__URL__/upload" enctype="multipart/form-data" method="post" >
<input type="text" name="name" />
<input type="file" name="photo" />
<input type="submit" value="提交" >
</form>
实例化上传类
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Uploads/'; // 设置附件上传根目录
$upload->savePath = ''; // 设置附件上传(子)目录
// 上传文件
$info = $upload->upload();
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功
$this->success('上传成功!');
}
这里对传过来的数据进行判断,个性化修改提示信息,用在后台修改图片和其他文件时非常有必要。
获取客户端的IP地址也非常简单
$ip = get_client_ip();
如果要支持IP定位功能,需要使用扩展类库Org\Net\IpLocation,并且要配合IP地址库文件一起使用,例如:
$Ip = new \Org\Net\IpLocation('UTFWry.dat'); // 实例化类 参数表示IP地址库文件
$area = $Ip->getlocation('203.34.5.66'); // 获取某个IP地址所在的位置
登录和注册需要验证码,直接实例化使用内置的类即可:
$Verify = new \Think\Verify();
$Verify->entry();
设置SESSION值:
session('name','value'); //设置session
$value = session('name');//获取session
session('name',null); // 删除name
设置COOKIE值:
cookie('name','value'); //设置cookie
cookie('name','value',3600); // 指定cookie保存时间
$value = cookie('name');//取值
cookie('name',null);//删除
控制器的定义控制器的名称采用驼峰法命名(首字母大写),控制器文件位于 Home/Controller/IndexController.class.php。
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function hello(){
echo 'hello';
}
public function test(){
echo 'test';
}
}
跳转和重定向
$User = M('User'); //实例化User对象
$result = $User->add($data);
if($result){
//设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
$this->success('新增成功', 'User/list');
} else {
//错误页面的默认跳转页面是返回前一页,通常不需要设置
$this->error('新增失败');
}
// 操作完成3秒后跳转到 /Article/index
$this->success('操作完成','/Article/index',3);
// 操作失败5秒后跳转到 /Article/error
$this->error('操作失败','/Article/error',5);
//重定向到指定的URL地址
redirect('/New/category/cate_id/2', 5, '页面跳转中...')
数据的CURD操作:
创建用create();
插入用add();
更新用save();
删除用delete();
自动验证表单合法性:
$rules = array(
array('verify','require','验证码必须!'), //默认情况下用正则进行验证
array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式
);
$User = M("User"); // 实例化User对象
if (!$User->validate($rules)->create()){
// 如果创建失败 表示验证没有通过 输出错误提示信息
exit($User->getError());
}else{
// 验证通过 可以进行其他数据操作
}
模板中变量输出:
$name = 'ThinkPHP';
$this->assign('name',$name);
$this->display();
如果是数组可以这样:
Name:{$data.name}
Email:{$data.email}
使用函数时可以这样:
{$data.name|md5}
也可以在模板中直接用php代码:
<?php echo (date("y-m-d",$create_time)); ?>
定义模型,名字一定要和数据表名字一致,否则提示改模型下无此方法
<?php
namespace Home\Model;
use Think\Model;
class SettingsModel extends Model {
public function t(){
echo 3243;
}
}}
还有很多细节的东西,只是偶尔记录一下。学习thinkphp还需要不断接触,不断解决遇到的问题。
我一直坚信“解决问题的过程就是进步的过程”所以,不断学习才是真理。