<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                # 模型實戰開發之模型使用技巧 > 本節課講的模型實際上是就是常說的物理模型 (數據模型) [TOC] ## 模型的建立 建立一個新模型很簡單 詳情參見 http://www.hmoore.net/mikkle/thinkphp5_study/268682 ~~~ namespace app\base\model; use think\Model; /** * Created by PhpStorm. * User: Mikkle * Q Q:776329498 * Date: 2017/2/8 * Time: 1:01 */ class AdminUser extends Base { protected $table = "my_admin_user"; } ~~~ >[info] 模型中使用中,我們根據自身情況繼承Base基類或者子基類,在模型中 > 模型中,只要定義好$table即可正常使用了. ## TP5模型最常用且實用的方法(寫入部分) ### 模型的自動完成功能 >[success] 支持auto、insert和update三個屬性,可以分別在寫入、新增和更新的時候進行字段的自動完成機制,auto屬性自動完成包含新增和更新操作 > 模型自動完成 只需要在model中定義三種對應的數組即可,注意未賦值的數組需要定義修改器 我們現在拿那個model實例說明一下:這個是半年前寫的代碼 點開下面鏈接查看全部代碼 http://www.hmoore.net/mikkle/thinkphp5_study/329928 ~~~ protected $insert = ['status'=>1,'guid','order_no','order_state'=>0,'pay_type'=>0,'send_state'=>0,'is_comment'=>0,'factory_state'=>0]; ~~~ 大家看一下這段代碼,我使用了 對象中$insert這個屬性賦值,負責方式是數組. >[danger] 當定義 $insert字段時,在寫入時候模型會自動處理這些字段 > 當定義 $update字段時,在更新時候模型會自動處理這些字段 > 當定義 $auto字段時,在寫入和更新時候模型都會自動處理這些字段 其中 guid 字段和order_no字段我并沒有給出指定的值,那這時候會調用對應的修改器對該字段進行賦值 這個自動完成非常實用 特別是寫入時候的自動完成($insert). ### 模型的修改器 >[danger] 模型的修改器作用是可以在數據賦值的時候自動進行轉換處理 #### 修改器的實例 我們看一下自動完成中提到的 guid 字段和order_no字段的修改器 ~~~ protected function setGuidAttr($value, $data) { return $this->create_uuid() ; } /** * 訂單類獲取器 含防重復篩查 * Power by Mikkle * QQ:776329498 * @param $value * @param $data * @return string */ protected function setOrderNoAttr($value, $data) { do { $order_no= date('Ymd').$this->builderRand(); } while ($this->where('order_no',$order_no)->count()==1); return $order_no ; } ~~~ #### 模型修改器的建立方式 >[info] 修改器方法的命名規范為:setFieldNameAttr 我們只要在將字段轉換成 大寫駝峰 拼接在set. 和 Attr之間即可 | 字段名稱 | 字段大寫駝峰名稱 |拼接后修改器對應方法名稱 | | --- | --- |--- | | guid | Guid |setGuidAttr | | order_no | OrderNo |setOrderNoAttr | #### 修改器參數說明 $value, $data | 值名稱 | 參數說明 |值類型| | --- | --- |--- | | $value | 當前模型中對應字段傳入的值 |--- | | $data | 當前模型中對應字段傳入的所有值 |數組 | #### 修改器實例講解 在訂單模型創建新數據時候,我需要在給新數據賦值一個新的GUID以及唯一的數字型訂單號, 這兩個實例都未用到$value, $data兩個參數,而使用到基類中的create_uuid builderRand ~~~ /** * 創建個性GUID * Power by Mikkle * QQ:776329498 * @param string $base_code * @return string */ public function create_uuid($base_code = '') { if (empty($base_code)) { $base_name = basename(str_replace('\\', '/', get_called_class()), '.php'); $uuid_list = ModelCode::$uuid_list; $base_code = isset($uuid_list[$base_name]) ? $uuid_list[$base_name] : 'QT'; } $uuid = $base_code . strtoupper(uniqid()) . $this->builderRand(6); return $uuid; } /** * 創建隨機數 * Power by Mikkle * QQ:776329498 * @param int $num 隨機數位數 * @return string */ public function builderRand($num=8){ return substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, $num); } ~~~ >[info] 其中 create_uuid這個方法名不規范啊,現在要想改一下啊,不知道要動多少文件. > (還有項目git中) 忍了吧 !大家千萬別學我 > 另外 setOrderNoAttr 方法中,通過while方法進行查庫比對 確保唯一 其實以前寫個的這個方法也不嚴謹,存在可能發生的bug ~~~ do { $order_no= date('Ymd').$this->builderRand(); } while ($this->where('order_no',$order_no)->count()==1); //bug 應該 count()>0; return $order_no ; ~~~ 如果數據庫中如果已經出現重復,那查庫驗證就失效了! 好吧!我承認,我是專職寫bug的! #### 修改器的觸發方法 修改器會在使用save方法觸發 官方文檔中也介紹了另一種觸發方法 ~~~ $user = new User(); $data['name'] = 'THINKPHP'; $data['email'] = 'thinkphp@qq.com'; $user->data($data, true); $user->save(); echo $user->name; // thinkphp ~~~ >[info] 換句話說就是使用model新增和修改都會調用和使用的修改器 ### 修改器使用注意事項即只讀屬性字段的應用 那么新的問題來了,當修改數據時候,如果傳值有這兩個字段數據時候,我們發現guid和order_no字段的全部變了.而且是修改一次變更一次.這兩個字段可以說是重要索引字段 那么所有關聯數據你猜會咋樣 TP5的model方法 自讀字段的設置 就最便捷的解決方法 > 不要問我 我是如何知道這個問題的,傷疤都快沒有了,大家不要再揭了 #### 只讀字段的定義 > 只讀字段用來保護某些特殊的字段值不被更改,這個字段的值一旦寫入,就無法更改。 要使用只讀字段的功能,我們只需要在模型中定義readonly屬性: ~~~ protected $readonly = ['guid','order_no']; ~~~ #### 只讀字段放的位置 我的基類中有下面一行代碼,一般人我不告訴他 嘿嘿 ~~~ protected $readonly = ['guid']; ~~~ ### 自動時間戳 >[info] **protected $autoWriteTimestamp = true;** 一句話的事情 ,我每個表基本都有 ### 類型轉換 這個我一直沒有怎么用到 想了解的 請查看官方手冊吧 http://www.hmoore.net/manual/thinkphp5/138669 >[info] 模型中寫入部分的常用的方法大體上 就這么多 再重申一下 一個是自動完成 一個修改器 還有一個只讀字段 這三個方法是配合使用來完成數據的數據寫入工作, ## TP5模型最常用且實用的方法(讀取部分) ### 獲取器的使用 >[info] 獲取器的作用是在獲取數據的字段值后按照我們定義的方法進行自動處理 #### 模型獲取器的建立方式 >[info] 修改器方法的命名規范為:**getFieldNameAttr** 還是看order例子中的一段代碼 ~~~ public function getPayTypeAttr($value, $data){ if ($value){ $get_data = ['WxPay'=>'微信支付','AliPay'=>'支付寶支付']; return isset($get_data[$value]) ? $get_data[$value] : '其他方式'; }else{ return $value; } } public function getIsPayTextAttr($value, $data){ $get_data = ['0'=>'未付款','1'=>'已付款']; return $get_data[$data['is_pay']]; } ~~~ 我們只要在將字段轉換成 大寫駝峰 拼接在get. 和 Attr之間即可 | 字段名稱 | 字段大寫駝峰名稱 |拼接后獲取器對應方法名稱 | | --- | --- |--- | | pay_type | PayType |getPayTypeAttr | | is_pay_text | IsPayText |getIsPayTextAttr | 當字段中不存在的時候,我們隨意append一個新字段,如果想獲取is_pay的中文說明,就append寫一個is_pay_text字段,并用$data中的值進行處理返回想要的值. #### 獲取器參數說明 $value, $data | 值名稱 | 參數說明 |值類型| | --- | --- |--- | | $value | 當前模型中對應字段讀取的值 |--- | | $data | 當前模型中讀取的所有值 |數組 | #### 獲取器的觸發方式 獲取器只有當獲取某個數據屬性的時候自動觸發,如果你要獲取包含修改器處理的全部數據屬性的話,可以使用下面的方法: | 觸發方法 | 觸發方法實例 | | --- | --- | | 模型的數據對象取值操作 | $model->field_name | | 模型的序列化輸出操作 | $model->toArray() ;$model->toJson() | | 顯式調用getAttr方法 | $this->getAttr('field_name') | | 附加字段要append | `$model->append(['field_name'])->toArray()` | 備注:定義修改器的字段 如果要獲取原始數據的時候 使用下面官方文檔中的方法 ~~~ $user = User::get(1); // 通過獲取器獲取字段 echo $user->status; // 獲取原始字段數據 echo $user->getData('status'); // 獲取全部原始數據 dump($user->getData()); ~~~ #### 獲取器小結 >[danger] 獲取器在項目中使用率比較高,我個人不建設使用和字段同名的獲取器,而使用別名的獲取器. > 特別是項目進行中時候,你添加的同名獲取器,可能會引發老代碼bug
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看