1. 程式人生 > >初識thinkphp(5)

初識thinkphp(5)

使用 HERE 模板 ID 修改 關聯 類名 打開 9.png

這次主要內容是模型的基本操作

0x01:什麽是模型

通過手冊的閱覽,籠統的說就是,把打開數據庫等操作在另一個php文件中進行

以及對變量的規則具體細節,查詢,取值等操作進行定義,方便在控制器中直接使用。

0x02:模型的使用

在index目錄下創建與controller同級的目錄model

創建php模型文件,並調用think\Model文件

<?php
    namespace app\index\model;
    use think\Model;
    class User extends Model{
        protected $table = ‘think_user‘;
        
protected function getBirthdayAttr($birthday){ return date(‘Y-m-d‘, $birthday); } protected function setBirthdayAttr($value){ return strtotime($value); } protected function scopeEmail($query){ $query->where(‘email‘, ‘[email protected]); } }
?>

table是獲取數據庫變量,之前在application\database.php文件中已經對打開數據庫進行關聯了。

getBirthdayAttr函數中命名規則 get + 名稱 + Attr

這樣能在控制器中直接調用 echo birthday變量 而不用再用date()函數進行轉換

setBirthdayAttr函數中命名規則 set + 名稱 + Attr

這樣在控制器中修改birthday不用調用strtotime()函數,而是直接的user->birthday = ‘xxxx-xx-xx‘

scopeEmail函數中命名規則 scope + 名稱

這樣在查詢的時候不用再寫sql語句或者thinkphp自帶的sql調用,就可以查詢相關聯內容

註意:這裏的函數中“名稱”即使變量名,如果不是變量名,會出現錯誤。

0x03:在控制器中模型的調用

對於數據庫的操作無意就是增刪改查

 public function add()
    {
        $user           = new UserModel;
        $user->nickname = ‘sijidou‘;
        $user->email    = ‘[email protected];
        $user->birthday = "1998-10-30"      //strtotime(‘1998-10-30‘);
        if ($user->save()) {
            return 增加成功信息;
        } else {
            return $user->getError();
        }
    }

增加無疑就是new一個模型,註意這裏的對象是模型裏面的類名,這裏因為控制器名字也叫User於是用引用修改了下模型中的User的名字

    use app\index\model\User as UserModel;

這裏的birthday實則調用了模型中的setBirthdayAttr函數,如果沒有setBirthdayAttr函數,信息可以存儲,但在最後輸出時候時間固定是1970-01-01的默認值(我這裏是這樣的)

    public function update($id){
            $user = UserModel::get($id);
            $user->nickname = ‘tudou‘;
            $user->email = ‘[email protected];
            $user->birthday = ‘1999-4-5‘;
            $user->save();
        }

        public function delete($id){
            $user = UserModel::get($id);
            if($user){
                $user->delete();
                return ‘刪除用戶成功‘;
            }
            else{
                return ‘刪除用戶不成功‘;
            }
        }
        public function search($email){
            $list = UserModel::scope(‘email‘, $email)->select();
            foreach($list as $user){
                echo $user->nickname . ‘<br/>‘;
                echo $user->email . ‘<br/>‘;
                echo $user->birthday . ‘<br/>‘;
            }
        }

改刪查中,改和刪都用到的是get,對應的默認調用了getBirthdayAttr函數,而查中的scope則調用的是scopeEmail函數,如果將email變量該為nickname並在模型中添加相應的scopeNickname($nickname)那麽可以根據nickname的值進行查詢。

0x04:與view之間的交互

這裏我使用的官方提供的html模板,源碼就不貼了,反正就是個form表格,和一點css。

技術分享圖片

這裏將控制器的內容傳到視圖裏面去,需要用view方法,且對應打開的視圖文件名稱默認為方法名稱

技術分享圖片

訪問的路徑為http://192.168.60.132/index/user/create

這裏對add()函數進行修改

技術分享圖片

input函數這裏是thinkphp特有的參數,主要功能是用來修改將代碼賦值內容改為用接收post傳參這裏的"post."中的‘.‘主要是用來匹配所有的參數,如果具體到某一個可以"post.nickname"

allowField(true)是thinkphp中特有的函數,功能是用來過濾非數據表中的數據

validate()函數是tinkphp中特有的函數,功能主要是用來校驗post過來的數據是否符合規範。

validate的內容在validate的模板中定義(在5.1版本中不可這樣定義了,直接在控制器下寫個函數就行)

validate模板路徑 .\index\validate\User.php

內容為

技術分享圖片

用rule來給鍵值對規定

require是必填

min:5是長度最小為5

email是檢測是否符合郵箱規範

dateFormat:Y-m-d檢測是否符合日期規範(數值不在月份日份以內也不行)

checkMail自定義方法:$value => email參數 $rule => ‘qq.com‘規則,用if語句判斷

preg_match是用於正則表達式匹配的比較函數

0x05:關聯與輸出

手冊講的挺多的,無非就是一對一、一對多、多對多

一對一:在一個中用this->hasOne(另一個模型名),另一個用belongsTo(前一個模型名)

一對多:在一個中用this->hasMany()來定義額外的(),其他與一對一一樣

多對多:與一對多差不多,即在每個模型中的belongToMany(對應模型1,對應模型2,。。。)

技術分享圖片

技術分享圖片

在add中如果要對關聯的模型修改

當前模型->關聯模型->關聯模型變量 = 內容

保存時候用(這裏用的示例函數,作者懶不想測試了,以後用得上再使用)

技術分享圖片

模型輸出

無非就是操作器裏面輸出或者跳轉到視圖裏面輸出

跳轉到視圖用view(‘視圖文件名字‘),一般是在controller同級目錄下的view文件裏面

不帶參數默認與方法名字相同。

在操作器內輸出用var_dump也行,return也行

這裏還可以用ToArray()來將數組輸出,hidden([變量名])來隱藏相應變量輸出,visible([變量])來指定有且只有定義的變量輸出。

總結:這節內容差不多就這樣,之前寫的幾篇示例我覺得太詳細了,以至於像教科書般的流水賬,寫博文主要還是記筆記,記重點,所以這裏比較精簡。以及最後的關聯相關的內容並沒有測試,等到以後實際操作時候再用吧。最近要期末了,又沒期末復習,又沒寫博客,真是太頹廢了。

初識thinkphp(5)