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    = 'thinkphp@qq.com';
$user->save();
$user = new User($_POST);
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save();

save方法返回写入的记录数

添加多条:

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

更新:

$user = User::get(1);
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();
$user = new User;
$list = [
    ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']
];
$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;
            }
        });
    }
}

多表关联

<?php
namespace app\index\model;

use think\Model;

class Profile extends Model 
{
    public function user()
    {
        return $this->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基础模板:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}标题{/block}</title>
</head>
<body>
{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="footer"}底部{/block}
</body>
</html>

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

{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首页</a>
<a href="/info/" >资讯</a>
<a href="/bbs/" >论坛</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
<a href="/new/{$vo.id}">{$vo.title}</a><br/>
 {$vo.content}
{/volist}
{/block}
{block name="right"}
 最新资讯:
{volist name="news" id="new"}
<a href="/new/{$new.id}">{$new.title}</a><br/>
{/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}<br>
{/volist}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容