# 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依賴管理工具