THINKPHP 5 的基本模型關(guān)聯(lián)
2021-04-20
1.創(chuàng)建thinkPHP模型
用cmd指令在文件根目錄下創(chuàng)建模型php think make:model 模塊/模型名稱
模型會創(chuàng)建在application目錄下的 “模塊\模型[模型名稱]” 中。
2.模型命名
模型類的命名規(guī)則是除去表前綴的數(shù)據(jù)表名稱,采用駝峰法命名,并且首字母大寫,比如表的表前綴是 db_
在模型名稱里就需要省略掉。所以 db_admin
表的模型類名就是 Admin
, db_admin_message
的模型類名就是AdminMessage
3.一對一關(guān)聯(lián)
hasOne (‘關(guān)聯(lián)模型名’,‘關(guān)聯(lián)外鍵’,‘主鍵’,‘別名定義’, ‘join類型’)
關(guān)聯(lián)操作都是基于(第一)模型的話,(第二)模型中并不需要定義關(guān)聯(lián)方法,使用belongsTo 方法就可以。
belongsTo 方法和 hasOne 一樣,也有5個參數(shù):
belongsTo(‘關(guān)聯(lián)模型名’,‘關(guān)聯(lián)外鍵’,‘關(guān)聯(lián)模型主鍵’,‘別名定義’,‘join類型’)
a.模型定義
// 定義關(guān)聯(lián)方法,在User模型哄下定義 public function profile(){ //HASONE關(guān)聯(lián) return $this->hasOne('Profile','id', 'id'); }
在User模型定義好關(guān)聯(lián)的方法之后在Profile模型里可以不用寫任何對應(yīng)的方法,但是必須最少要有一個對應(yīng)db_Profile 表的空模型。
b.倘若關(guān)聯(lián)操作都基于profile方法時,在Profile模型下定義
public function user(){ //檔案BELONGSTO關(guān)聯(lián)操作都基于profile方法時,直接使用 return $this->belongsTo('User'); }
c.控制器調(diào)用
public function index($name='name'){ //get 1 是獲取id為 1 的數(shù)據(jù) //find() 是查找 //toArray() 是獲取到的數(shù)據(jù)轉(zhuǎn)為數(shù)組 $admin= Admin::get(1); //查巡當(dāng)前Admin模型數(shù)據(jù) var_dump($admin->find()->toArray()); //查巡關(guān)聯(lián)模型AdminMessage模型數(shù)據(jù) $admin= $admin->AdminMessage->find()->toArray(); }
d.輸出結(jié)果:
4.一對多關(guān)聯(lián)
hasMany(‘關(guān)聯(lián)模型名’,‘關(guān)聯(lián)外鍵’,‘關(guān)聯(lián)模型主鍵’,‘別名定義’)
a.模型調(diào)用
public function books(){ return $this->hasMany('Book','id','id'); }
b.控制器調(diào)用
關(guān)聯(lián)添加:也可以批量增加數(shù)據(jù)
關(guān)聯(lián)查詢:可以直接調(diào)用模型的屬性獲取全部關(guān)聯(lián)數(shù)據(jù)
public function read(){ $user = UserModel::get(1); // 獲取狀態(tài)為1的關(guān)聯(lián)數(shù)據(jù) $books = $user->books()->where('status',1)->select(); dump($books); // 獲取作者寫的某本書 $book = $user->books()->getByTitle('ThinkPHP5快速入門'); dump($book); }
關(guān)聯(lián)更新:
public function update($id){ $user = UserModel::get($id); $book = $user->books()->getByTitle('ThinkPHP5開發(fā)手冊'); $book->title = 'ThinkPHP5快速入門'; $book->save(); }
關(guān)聯(lián)刪除:
//刪除部分關(guān)聯(lián)數(shù)據(jù): $book = $user->books()->getByTitle('ThinkPHP5開發(fā)手冊'); $book->delete(); //刪除所有的關(guān)聯(lián)數(shù)據(jù): if($user->delete()){ // 刪除所有的關(guān)聯(lián)數(shù)據(jù) $user->books()->delete(); }
5.多對多關(guān)聯(lián)
一個用戶會有多個角色,同時一個角色也會包含多個用戶,這就是一個典型的多對多關(guān)聯(lián)
多對多關(guān)聯(lián)通常一定會有一個中間表,也稱為樞紐表,所以需要創(chuàng)建一個用戶角色的中間表
belongsToMany 的參數(shù)如下
belongsToMany(‘關(guān)聯(lián)模型名’,‘中間表名稱’,‘關(guān)聯(lián)外鍵’,‘關(guān)聯(lián)模型主鍵’,‘別名定義’)
對于樞紐表并不需要創(chuàng)建模型類,在多對多關(guān)聯(lián)關(guān)系中,并不需要直接操作樞紐表。
a.模型定義
// 定義多對多關(guān)聯(lián) public function roles(){ // 用戶 BELONGS_TO_MANY 角色 return $this->belongsToMany('Role', 'think_access'); }
關(guān)聯(lián)新增
新增用戶角色 并自動寫入樞紐表
$user->roles()->save(['name' => 'editor', 'title' => '編輯']);
批量新增
$user->roles()->saveAll([ ['name' => 'leader', 'title' => '領(lǐng)導(dǎo)'], ['name' => 'admin', 'title' => '管理員'], ]);
由于該角色已經(jīng)存在了,所以只需要使用attach 方法增加樞紐表的關(guān)聯(lián)數(shù)據(jù):
$user->roles()->attach($role);
關(guān)聯(lián)刪除
使用detach 方法刪除關(guān)聯(lián)的樞紐表數(shù)據(jù),但不會刪除關(guān)聯(lián)模型數(shù)據(jù)
$user->roles()->detach($role);
刪除樞紐表的同時刪除關(guān)聯(lián)模型
$user->roles()->detach($role,true);
6.模型輸出
輸出數(shù)組: toArray 方法把模型對象輸出為數(shù)組。
$user->toArray()
隱藏屬性:hidden方法在輸出的時候隱藏某些屬性
模型名->方法([字段名稱,字段名稱,***]) $user->hidden(['create_time','update_time'])->toArray()
指定屬性:visible方法指定一些屬性輸出
模型名->方法([字段名稱,字段名稱,***])
$user->visible(['id','nickname','email'])->toArray()
追加屬性
如果讀取器定義了一些非數(shù)據(jù)庫字段的讀取,例如:
class User extends Model{ // status修改器 protected function getUserStatusAttr($value){ $status = [-1 => '刪除', 0 => '禁用', 1 => '正常', 2 => '待審核']; return $status[$value]; } }
如果需要輸出(字段名稱) 屬性數(shù)據(jù)的話,可以使用append 方法
$user->append(['user_status'])->toArray()
輸出json:對于API 開發(fā)而言,經(jīng)常需要返回JSON 格式的數(shù)據(jù)
$user->toJson()
如果需要輸出(字段名稱) 屬性數(shù)據(jù)的話,可以使用append 方法
$user->append(['user_status'])->toArray()
輸出json:對于API 開發(fā)而言,經(jīng)常需要返回JSON 格式的數(shù)據(jù)
$user->toJson()