thinkphp学习笔记,模型关联取字段等

在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还需要不断接触,不断解决遇到的问题。

我一直坚信“解决问题的过程就是进步的过程”所以,不断学习才是真理。


评论/留言