<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>

                ## TP5實戰開發---模型技巧 在MVC模式下 model 的靈活應用可以減少代碼量,邏輯處理也更加清晰明確 下面 我拿一個商城的訂單Model實例來簡單介紹TP5的模型 (model)的用法 ~~~ <?php /** * Created by PhpStorm. * User: Mikkle * Email:776329498@qq.com * Date: 2017/1/4 * Time: 17:00 */ namespace app\base\model; use think\Db; use think\Model; class Orders extends Base { protected $table = "my_orders"; protected $name = "orders"; protected $pk = "id"; protected $insert = ['status'=>1,'guid','order_no','order_state'=>0,'pay_type'=>0,'send_state'=>0,'is_comment'=>0,'factory_state'=>0]; protected $autoWriteTimestamp = true; } ~~~ 先看一下前一部分 >[info] protected $table = "my_orders"; //表名 > protected $name = "orders"; > protected $pk = "id"; > protected $insert = ['status'=>1,'guid','order_no','order_state'=>0,'pay_type'=>0,'send_state'=>0,'is_comment'=>0,'factory_state'=>0]; > protected $autoWriteTimestamp = true; //開啟時間戳 其中這一部分主要說的是 自動完成 protected $insert 在這部分中后面定義了一個數組,其中有一部分已經定義值 而未賦值將自動調用修改器完成。 ### Model中的獲取器和修改器 >[info] 詳情參見 我這里只講實例 > 獲取器 http://www.hmoore.net/manual/thinkphp5/135192 > 修改器 http://www.hmoore.net/manual/thinkphp5/135193 在這個訂單表中 使用獲取器 ~~~ /** * 獲取器 * Power by Mikkle * QQ:776329498 * @param $value * @param $data * @return mixed */ public function getDistributeAttr($value, $data){ $get_data = ['SF'=>'順豐快遞','ZT'=>'中通快遞']; return $get_data[$value]; } public function getPayTimeAttr($value, $data){ return date('Y-m-d h:i:s', $value); } 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']]; } ~~~ 這幾個獲取器都比較簡單,都是常用數據轉換。 * * * * * 下面的源碼是修改器 ~~~ 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 ; } ~~~ 其中 setGuidAttr 使用model基類的create_uuid方法創造guid,而setOrderNoAttr是生產不重復的訂單號,生成方法依然使用了基類的方法。這里使用 do while循環進行了一次唯一性過濾(當數值存在,重新獲取) >[danger] 需要注意的是,為了防止訂單號的重復,這里使用一次查庫過濾,雖然重復的幾率低,但是這種類型的值進行一次查庫還是有必要的。 * * * * * 下面這個例子是是分頁搜索的list列表,這里附加了字段不存在的cover_info的獲取器, ~~~ /** * 獲取訂單列表 含append用法 * Power by Mikkle * QQ:776329498 * @param array $map * @param string $order * @param int $limit * @param int $page * @return array */ public function getOrderList($map=[],$order = 'id desc',$limit=8,$page=1){ $field='order_no,order_num,amount,distribute,create_time,is_pay,send_state,order_state'; $map['status']=1; $data=$this->where($map)->field($field) ->limit($limit) ->page($page) ->order($order)->select(); $re=[]; foreach($data as $order){ $re[]= $order->append(['cover_info'])->toArray(); } return $re; } ~~~ >[danger] 注意:模型中使用select返回的是多個對象的數組,對象中的獲取器只有在單個對象toArray才會全部生效, $re=[]; foreach($data as $order){ $re[]= $order->append(['cover_info'])->toArray(); } return $re; 所以在這個獲取器最后加入foreach循環 * * * * * 下面這個例子是訂單詳情 ~~~ /** * 訂單詳情 * Power by Mikkle * QQ:776329498 * @param array $map * @return array|bool|false|\PDOStatement|string|Model */ public function getOrderInfo($map=[]){ if (!$map) return false; $field = 'order_no,amount,distribute,order_desc,consignee_name,consignee_mobile,consignee_address,send_state,is_pay,is_comment,order_state,create_time'; $data=$this->where($map)->field($field)->find(); if (!$data) return false; //$data['cart_list']=$data->hasManyThrough('VGuidAll','OrdersAccess','order_no','my_guid','order_no')->select(); $data['cart_list']=$this->getOrderAccessList($data['order_no']); return $data; } /** * 訂單簡要信息 * Power by Mikkle * QQ:776329498 * @param $order_no * @return array|bool|false|\PDOStatement|string|Model */ public function getOrderSimpleInfo($order_no){ if (!$order_no) return false; $map['order_no']=$order_no; $field = 'order_no,amount,distribute,order_desc,consignee_name,consignee_mobile,consignee_address,create_time'; $data=$this->where($map)->field($field)->find(); if (!$data) return false; return $data; } /* * 關聯 */ public function orderAccess(){ $this->hasMany('OrdersAccess','order_no','order_no'); } /** * 視圖查詢 * Power by Mikkle * QQ:776329498 * @param $order_no * @return false|\PDOStatement|string|\think\Collection */ public function getOrderAccessList($order_no){ return Db::view('my_orders_access','id,order_no,my_guid,my_num,my_price,is_comment') ->view('my_guid_all','my_name,my_type,my_price,my_pic','my_orders_access.my_guid=my_guid_all.my_guid') ->view('my_common_picture','path','my_common_picture.id=my_guid_all.my_pic') ->where('order_no',$order_no) ->cache('OrderList_'.$order_no) ->select(); } ~~~ >[danger] 在getOrderInfo方法中,比較復雜在初期寫的時候使用了關聯,后期修改會使用單獨的方法getOrderAccessList > $data['cart_list']=$this->getOrderAccessList($data['order_no']); > 在方法getOrderAccessList中使用了視圖view的方法,還使用了緩存(訂單商品列表是禁止修改的,所以這里為了加快查詢速度使用了緩存) > PS:其實實現的方法很多,商品詳情列表使用獲取器也是可以完成的,大家也可以想一下。 * * * * * 下面這個實例是Model的數據庫的關聯和事務操作 ~~~ try{ $this->startTrans(); $this->data($order_data)->isUpdate(false)->save(); $new_order = $this->order_no; if (!is_numeric($new_order)) throw new \Exception("商品訂單添加失敗"); $this->hasMany('OrdersAccess', 'order_no', 'order_no')->saveAll($data_order); $this->commit(); return ['code' => '1001', 'msg' => '商品訂單添加成功', 'data' => ['order_no' => $new_order, 'cart_list' => $data_order]]; }catch (\Exception $e){ $this->rollback(); return ['code'=>'1008','msg'=>'商品訂單添加失敗','data']; } ~~~ 注意:數據只要涉及多表一致性操作,必須要開啟數據庫事務操作 * 更多model示例請見附件4
                  <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>

                              哎呀哎呀视频在线观看