ThinkPhp5.0学习笔记(二)

数据库

配置数据库

在使用数据库之前必须要写配置数据库database.php

原生操作

query(查询操作)和execute(写入操作)

Db::query('select * from think_user where id=?',[8]);
Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);

利用构造器

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->where('status',1)
    ->find();
Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->whereOr('title','like','%thinkphp')
    ->find();
Db::table('think_user')->field('id,title,content')->select();

这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值。执行的SQL相当于:

SELECT id,title,content FROM table

推荐操作

使用model

模型Model

定义

namespace app\index\model;

use think\Model;

class User extends Model
{
  // 设置当前模型对应的完整数据表名称
    protected $table = 'think_user';//非必须
  //默认主键自动识别,如需要指定课设置属性
    protected $pk = 'uid';//非必须
}

模型会自动对应数据表,采用驼峰法命名,并且首字母大写,例如:

模型名 约定对应数据表(假设数据库的前缀定义是 think_)
User think_user
UserType think_user_type

数据库前缀在database.php设置

调用模型

// 实例化模型
$user = new User;//记得引入命名空间
$user->name= 'thinkphp';
$user->save();

利用模型进行数据库的增删改查

$user           = new User;
$user->name     = 'thinkphp';
$user->email    = '[email protected]';
$user->save();
$user = new User($_POST);
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save();

save方法返回写入的记录数

添加多条:

$user = new User;
$list = [
    ['name'=>'thinkphp','email'=>'[email protected]'],
    ['name'=>'onethink','email'=>'[email protected]']
];
$user->saveAll($list);

更新:

$user = User::get(1);
$user->name     = 'thinkphp';
$user->email    = '[email protected]';
$user->save();
$user = new User;
$list = [
    ['id'=>1, 'name'=>'thinkphp', 'email'=>'[email protected]'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'[email protected]']
];
$user->saveAll($list);

删除:

User::destroy(1);
// 支持批量删除多个数据
User::destroy('1,2,3');
// 删除状态为0的数据
User::destroy(['status' => 0]);
User::where('id','>',10)->delete();

查询:

$user = new User();
// 查询单个数据
$user->where('name', 'thinkphp')
    ->find();

get或者find方法返回的是当前模型的对象实例,可以使用模型的方法。

获取器

eg:从数据库里获取性别为1,转化为男

class User extends Model 
{
    public function getStatusAttr($value)
    {
        $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
        return $status[$value];
    }
}

status是表里的一个字段

$user = User::get(1);
echo $user->status; // 不会输出数字而是数字对应的文字

修改器

数据赋值时进行转换处理

class User extends Model 
{
    public function setNameAttr($value)
    {
        return strtolower($value);
    }
}

保存到数据库中的时候会转为小写

$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->name; // thinkphp

修改器只在执行模型的save方法的时候触发

时间戳

数据库配置文件中添加全局设置:

// 开启自动写入时间戳字段
'auto_timestamp' => true,

or

// 开启自动写入时间戳字段
'auto_timestamp' => 'datetime',

字段名默认创建时间字段为create_time,更新时间字段为update_time,支持的字段类型包括timestamp/datetime/int

写入数据的时候,系统会自动写入create_timeupdate_time字段

eg:

$user = new User();
$user->name = 'THINKPHP';
$user->save();
echo $user->create_time; // 输出类似 2019-06-16 14:20:10
echo $user->update_time; // 输出类似 2019-06-16 14:24:27

只读字段

class User extends Model
{
    protected $readonly = ['name','email'];
}

nameemail字段为只读字段,不允许被更改,写了就改不了了

类型转换

写入和读取的时候自动进行类型转换处理

class User extends Model 
{
    protected $type = [
        'status'    =>  'integer',
        'score'     =>  'float',
        'birthday'  =>  'datetime',
        'info'      =>  'array',
    ];
}

如果设置为强制转换为array类型,系统会自动把数组编码为json格式字符串写入数据库,取出来的时候会自动解码。

指定为json类型的话,数据会自动json_encode写入,并且在读取的时候自动json_decode处理。

模型分层

  • 数据层:app\index\model\User 用于定义数据相关的自动验证和自动完成和数据存取接口
  • 逻辑层:app\index\logic\User 用于定义用户相关的业务逻辑
  • 服务层:app\index\service\User 用于定义用户相关的服务接口等

app\index\model\User.php

namespace app\index\model;

use think\Model;

class User extends Model
{
}

实例化方法:\think\Loader::model('User')

Logic类:app\index\logic\User.php

namespace app\index\logic;

use think\Model;

class User extends Model
{
}

实例化方法:\think\Loader::model('User','logic');

Service类:app\index\service\User.php

namespace app\index\service;

use think\Model;

class User extends Model
{
}

实例化方法:\think\Loader::model('User','service');

模型toArray

$user = User::find(1);
dump($user->toArray());

模型toJson

$user = User::get(1);
echo $user->toJson();

事件

在进行模型写入操作时触发的操作行为,包括模型的save方法和delete方法

事件支持

before_deleteafter_deletebefore_writeafter_writebefore_updateafter_updatebefore_insertafter_insert

namespace app\index\model;

use think\Model;

class User extends Model
{
    protected static function init()
    {
        User::event('before_insert', function ($user) {
            if ($user->status != 1) {
                return false;
            }
        });
    }
}

多表关联

belongsTo('User','uid');//uid为关联外键
    }
}

关联后就可以:

$profile = Profile::get(1);
// 输出User关联模型的属性
echo $profile->user->account;

视图View

实例化:

继承了\think\controller:

便可以直接调用:

方法 说明
fetch 渲染模板输出
display 渲染内容输出
assign 模板变量赋值

eg:

return $this->display('index');

没有继承think\controller

return \view('index')

模板

变量输出

在模板中输出变量

$view = new View();
$view->name = 'ThinkPHP';
return $view->fetch();

前端页面(eg:html)

Hello,{$name}!

运行的时候就会在前端显示: Hello,ThinkPHP!

模块继承

一个模板中可以定义任意多个名称标识不重复的区块,例如下面定义了一个base.html基础模板:




{block name="title"}标题{/block}


{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="footer"}底部{/block}


在子模板(其实是当前操作的入口模板)中使用继承

{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
首页
资讯
论坛
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
{$vo.title}
{$vo.content} {/volist} {/block} {block name="right"} 最新资讯: {volist name="news" id="new"} {$new.title}
{/volist} {/block} {block name="footer"} {__block__} @ThinkPHP 版权所有 {/block}

常见内置标签

标签名 作用 包含属性
include 包含外部模板文件(闭合) file
load 导入资源文件(闭合 包括js css import别名) file,href,type,value,basepath
volist 循环数组数据输出 name,id,offset,length,key,mod
foreach 数组或对象遍历输出 name,item,key

※ volist通常用于查询数据集(select方法)

控制器中给模板赋值:

$list = User::all();
$this->assign('list',$list);

模板:

{volist name='list' id='data'}
ID为{$data.id}:名字为{$data.name}
{/volist}

你可能感兴趣的:(ThinkPhp5.0学习笔记(二))