# ThinkPHP6 模型
---
## 一、创建模型
* 请确保你已经在数据库配置文件中配置了数据库连接信息
* 模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写
* 模型自动对应的数据表名称都是遵循小写+下划线规范,如果你的表名有大写的情况,必须通过设置模型的table属性。
**模型名**|**对应数据表**|**数据库前缀**
---|---|---
Admin|admin|tp_admin
User|user|tp_user
UserOrder|user_order|tp_user_order
> 表前缀设置:`config/database.php` 文件里 `prefix`
### 1、单项目模型创建
* 第一步:创建一个跟控制器平级的目录,目录名:`model`
* 第二步:在 `model` 创建 `Admins.php` 文件
### 2、多项目模型创建
* 第一步:在 `index` 项目中创建目录,目录名:`model`
* 第二步:在 `model` 创建 `Admins.php` 文件
---
## 二、模型操作
> 在模型中除了可以调用数据库类的方法之外(换句话说,数据库的所有查询构造器方法模型中都可以支持),可以定义自己的方法,所以也可以把模型看成是数据库的增强版。
* 模型文件里的自定义方法,不要和 `thinkphp` 方法一样名称
* 模型里的 `Admins::` 也可以用 `static::` 关键词
* 链式操作,都可以在模型里使用
```php
controller公用示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
}
}
```
### 1、模型 查询数据
* `find` 获取单条数据,返回的是当前模型的对象实例
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$find = Admins::find(1);
$find = Admins::where('id',2)->find();
return $find;
}
}
```
* `select` 获取多条数据,返回的是当前模型的对象实例
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$select = Admins::select();
$select = Admins::select([1]);
$select = Admins::where('id','>',1)->select();
return $select;
}
}
```
* `value` 获取单个字段数据
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$select = Admins::where('id','>',1)->value('username');
return $select;
}
}
```
* `column` 获取一列字段数据
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$select = Admins::column('username');
$select = Admins::column('username','id');
return $select;
}
}
```
### 2、模型 增加数据
* `create` 静态方法添加数据,返回的是当前模型的对象实例
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$create = Admins::create([
'username' => 'huazheng',
'password' => md5(123456),
'truename' => '华筝'
]);
echo $create->id; // 可以直接获取自增id
return $create;
}
}
```
> 新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据。
### 3、模型 修改数据
* `update` 静态方法修改数据,返回的是当前模型的对象实例
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$update = Admins::update(['username'=>'欧阳克'],['id'=>1]);
return $update;
}
}
```
### 4、模型 删除数据
* `delete` 静态方法删除数据,返回的是当前模型的对象实例
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$delete = Admins::where('id',3)->delete();
return $delete;
}
}
```
---
## 三、模型特点
* TP模型如果只能增删查改,不如在 `Controller` 执行了。TP模型很多特点,下面为大家一一介绍
### 1、模型设置
* 为了和数据库更好的适配,模型可以提前设置对应的数据库属性
**属性**|**描述**
---|---
name|模型名(相当于不带数据表前后缀的表名,默认为当前模型类名)
table|数据表名(默认自动获取)
pk|主键名(默认为 `id` )
schema|模型对应数据表字段及类型
disuse|数据表废弃字段(数组)
|
|
suffix|数据表后缀(默认为空)
connection|数据库连接(默认读取数据库配置)
type|模型需要自动转换的字段及类型
query|模型使用的查询类名称
field|模型允许写入的字段列表(数组)
strict|是否严格区分字段大小写(默认为 `true` )
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
protected $name = 'User';
protected $table = 'user';
protected $pk = 'uid';
public function index(){
$select = User::select();
return $select;
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
}
}
```
* `Controller` 返回结果是数组, `Model` 返回模型的数据集。
* 两种返回值,使用方式没有区别
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
protected $name = 'User';
protected $table = 'user';
protected $pk = 'uid';
public function index(){
$select = User::select();
return $select;
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
use think\facade\Db;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
$select = Db::table('user')->select();
print_r($select);
}
}
```
* `schema` 设置模型对应数据表字段及类型。默认会自动获取(包括字段类型),但自动获取会导致增加一次查询。
> 类型根据php数据类型定义,如果是json类型直接定义为json即可
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
protected $name = 'User';
protected $table = 'user';
protected $pk = 'uid';
protected $schema = [
'uid' => 'int',
'u_name' => 'string'
];
public function index(){
$select = User::select();
return $select;
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
}
}
```
* `disuse` 数据表废弃字段(数组)。去掉表中不需要的字段
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
protected $name = 'User';
protected $table = 'user';
protected $pk = 'uid';
protected $disuse = [ 'phone', 'sex','age','status' ];
public function index(){
$select = User::select();
return $select;
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
}
}
```
### 2、模型 实例化
> 模型可以使用静态访问,也可以使用 `new` 实例化
* `save` 添加或修改数据,返回成功或失败
* 要实例化 `user`,必须有 `user` 这个模型文件
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function add(){
$user = new User;
$save = $user->save([
'phone' => '13522222222',
'u_name' => '梅超风',
'sex' => 1,
'age' => 67
]);
return $save; // 返回成功1,失败0
return $user->uid; // 返回自增ID
}
public function adds(){
$user = new User;
$user->phone = '13533333333';
$user->u_name = '曲灵风';
$user->sex = 1;
$user->age = 35;
$save = $user->save();
return $save; // 返回成功1,失败0
return $user->uid; // 返回自增ID
}
public function edit(){
$user = new User;
$list = [
'phone'=>'13544444444',
'u_name'=>'陈玄风',
'sex'=>2,
'age'=>32
];
$save = $user->where(['uid'=>37])->save($list);
return $save;
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$add = $db->add();
echo $add;
$adds = $db->adds();
echo $adds;
$edit = $db->edit();
echo $edit;
}
}
```
* `saveAll` 批量添加或修改数据
> 批量更新仅能根据主键值进行更新,如果主键不是 ID 就不能用
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function add(){
$user = new Admins;
$list = [
['username'=>'ouyangke','password'=>md5(123456),'truename'=>'欧阳克'],
['username'=>'huangrong','password'=>md5(123456),'truename'=>'黄蓉']
];
$saveAll = $user->saveAll($list);
return $saveAll;
}
public function edit(){
$user = new Admins;
$list = [
['username'=>'陈玄风','id'=>3],
['username'=>'梅超风','id'=>4]
];
$saveAll = $user->saveAll($list);
return $saveAll;
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$add = $db->add();
print_r($add);
$edit = $db->edit();
print_r($edit);
}
}
```
### 3、模型 获取器
* 获取器的作用是对模型实例的(原始)数据做出自动处理
* 命名规则: `get` + 字段名 + `Attr`
* 字段名是数据表字段的驼峰转换
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$user = Admins::find(1);
echo $user->status;
return $user;
}
public function getStatusAttr($v){
$status = [0=>'禁用',1=>'开启'];
return $status[$v];
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
print_r($index->status);
}
}
```
### 4、模型 修改器
* 修改器的主要作用是对模型设置的数据对象值进行处理
* 命名规则: `set` + 字段名 + `Attr`
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$admins = Admins::create([
'username' => 'YangKang',
'password' => md5('123456'),
'truename' => '杨康'
]);
return $admins;
}
public function setUsernameAttr($v){
return strtolower($v); // 账户只能小写
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
}
}
```
### 5、模型 搜索器
* 搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式
* 命名规则: `search` + 字段名 + `Attr`
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$admins = Admins::withSearch(['username',[
'username' => 'admi'
])->select();
return $admins;
}
public function searchUsernameAttr($query,$v){
$query->where('username','like', $v . '%');
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
}
}
```
### 6、模型 检查数据
* 如果要判断数据集是否为空,不能直接使用 `empty` 判断
* 必须使用数据集对象的 `isEmpty` 方法判断
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
public function index(){
$admins = Admins::where('username','1')->select();
if(empty($admins)){
echo 111;
}
if($admins->isEmpty()){
echo 111;
}
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
}
}
```
### 7、模型 只读字段
```php
model示例:
namespace app\index\model;
use think\Model;
class Admins extends Model{
protected $readonly = ['username'];
public function index(){
$admins = Admins::update(['username' => '穆念慈'], ['id' => 6]);
return $admins;
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
}
}
```
### 8、模型 软删除
* 软删除功能,需要引入 `SoftDelete`
* 需要创建一个 `delete_time` 字段
* 软删除的删除操作仅对模型的删除方法有效
```php
model示例:
namespace app\index\model;
use think\Model;
use think\model\concern\SoftDelete;
class Admins extends Model{
use SoftDelete;
protected $deleteTime = 'delete_time'; //软删除标记字段
protected $defaultSoftDelete = 0; // 软删除字段的默认值
public function index(){
$admins = Admins::destroy(6);
return $admins;
}
}
```
```php
controller示例:
namespace app\index\controller;
use app\BaseController;
use app\index\model\Admins;
class Index extends BaseController{
public function index(){
$db = new Admins();
$index = $db->index();
print_r($index);
}
}
```
- 序言
- PHP基础
- 认识PHP
- 环境安装
- PHP语法
- 流程控制
- PHP数组
- PHP函数
- PHP类与对象
- PHP命名空间
- PHP7新特性
- PHP方法库
- PHP交互
- 前后端交互
- 项目常规开发流程
- MySQL数据库
- 会话控制
- Ajax分页技术
- 细说函数
- 类与对象
- 对象进阶
- 类与对象进阶
- OOP面向对象
- 设计模式
- 路由与模板引擎
- 异常类
- PHP爬虫
- PHP抓取函数
- PHP匹配函数
- 正则表达式
- PHP字符串函数
- 抓取实战
- PHP接口
- 了解接口
- PHP插件
- PHPSpreadsheet
- ThinkPHP6
- 安装
- 架构
- 数据库
- 数据库操作
- 视图
- 模版
- 模型
- 杂项
- 命令行
- 交互
- 微信小程序
- 介绍
- 配置
- 组件
- 交互
- API
- 其他知识
- 百度小程序
- 介绍
- 配置
- 组件
- 交互
- API
- 其他知识
- Linux
- 服务器上线流程
- 安装svn
- MySQL
- 认识MySQL
- MySQL函数
- 杂项
- composer依赖管理工具