日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TP5_模型初始化_踩坑记录

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TP5_模型初始化_踩坑记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

先交代下背景,在一個項目中,有一個數據表有水平分表的需求。當時想找到一種方法,把對數據庫的操作,寫到一個模型里,通過去換模型屬性中的table來達到代碼不變操作的數據表變化的效果。
我們都知道,模型要想關聯數據表的話,有兩中方式,第一種就是將模型名和數據表一致。這樣模型就會默認關聯到名字對應的數據表。第二種就是定義模型的 protected $table 來指定表明。我當時就想,有沒有什么方法,能初始化模型對象的時候將table屬性賦值呢,這個值存在數據庫里。這樣就可以動態的來控制這個模型關聯的表名了。

模型初始化

基于以上的需求,文檔里的模型初始化引起了我的注意


tp5文檔

我感覺這是我要找的東西。緊接著我著手開始測試

首次測試

我根據手冊的寫法,在調用父類初始化后面,寫上對table的初始化,那么現在我們來打印出來實例化的order模型


打印實例化對象

從圖中大家可以發現,table屬性的確已經修改了。然后我就沒有再做更多的測試了,因為我試過手動將table數據改為別的表名,就可以修改模型所關聯的數據表。我想這個table屬性已經有了肯定就沒問題了。

直到我在這個模型里寫了很多方法后,我想去回來換個表名來試試寫入數據。爆炸的事情出現了。

//我使用包含table屬性的對象去查數據庫。查詢出來的結果,居然任然是原來那個模型名對應的表$order = new \app\API\model\Order();return $order->select();

這就很爆炸了,我已經寫好的這么多代碼難道都不能用了?

冷靜下來之后,我決定先試試,手動在模型中該表table屬性來試試。


直接修改模型的table屬性

那么我們再來訪問下呢?


image.png

報錯,報表不存在,這是正確的,因為我沒有建立order_1這個表。不過這也說明了,order模型的確已經和order_1表關聯起來了。這樣就讓我摸不著頭腦了。以前學習面向對象那些理論又浮現在我們腦海里。我梳理了下思路

  • order模型中定義table屬性,其實是對父類Model中的table的重寫。并且table屬性是一個protected的。那么就是說,只有在模型內部或則子類中可以使用和修改
  • 在實例化模型的地方是控制器,也就是類的外部,理論上外部是對象只能讀取和操作類中public的屬性的
  • 可是initialize又是在實例化模型自動觸發的方法,觸發的地方又是在模型的內部。
  • 但是我又是使用$this 又是指代我控制器中的被實例化出來的模型對象。那是不是還是不能訪問被保護的屬性呢?
    好了瞎分析完了之后,我決定還是去網上搜索下,看看有沒有人和我一樣的應用場景。后來我發現,使用模型初始化的人,似乎很少。少數幾篇博客講解了下。其中有個應用場景和我類似。他在代碼中是這樣寫的
  • protected function initialize(){parent::initialize(); // TODO: Change the autogenerated stub$this->table('order_1');//假裝這里名字是從數據庫里取得}

    我通過IDE的智能感知,進入套table方法中,看了下注釋


    image.png

    看樣子是我需要的方法,可這個方法不是模型基類里的啊,是在query類當中的。我有些摸不清楚頭腦,但不管怎樣,還是要試一試

    為了讓代碼不報錯,我去增加了一個order_1表。這一試,嘿嘿,搞定了!


    image.png

    打印出了我在新表中的一條數據。哈哈,看來這個思路是可行的

    就在我認為這個思路是可行的時候,我在執行我寫好的一些模型方法時,我發現了一個大坑!!

    我就不詳細說我是怎么發現的了。直接看代碼
    模型里我還是這么寫的

    protected function initialize(){parent::initialize(); // TODO: Change the autogenerated stub$this->table('order_1');//假裝這里名字是從數據庫里取得} //控制器里實例化模型后,調用count方法$order = new \app\API\model\Order();var_dump($order->count());var_dump($order->count());die;

    結果讓人非常的震驚!


    結果

    同一個對象,調用同一個方法,結果居然不一樣!我反復試過都是這樣。我決定將他們的sql打印出來看看有什么問題


    image.png

    結果同樣是讓人哭笑不得


    image.png

    結果模型初始化是一次性的?(黑人問號.jpg)

    我當時就覺得是tp5的bug,我要向作者反應!

    后來我冷靜下來,還是先把項目問題解決了來再說哦。飯碗要緊。

    最終經過我的摸(luan)索(gao) ,我找到解決方案。下面就把代碼貼出來,但是我確實不知道怎么解釋這個問題。也希望大神能夠指出,感激不盡

    protected function initialize(){parent::initialize(); // TODO: Change the autogenerated stub$this->name('order_1');//將table方法換位name方法}

    name方法是也是指定表名,只是不帶表前綴。經測試,傳入不含表前綴的表名可行,我這里的數據表設計的時候沒有表前綴,所以傳的都一樣。

    那么改過之后,再來打印下之前的sql


    image.png

    經測試可以正常切換兩個表~

    本次博客只在記錄,內容中有很多自己瞎猜的,站不住腳,讓大神見笑。非常希望能有大神指點

    總結

    以上是生活随笔為你收集整理的TP5_模型初始化_踩坑记录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 午夜精品免费视频 | 毛片av网址| 一级片免费播放 | 夜夜操av | 综合狠狠开心 | 日韩二区视频 | 中国极品少妇xxxx做受 | 波多野结衣中文字幕一区二区三区 | 国产在线播放一区二区 | 色呦呦 | 中文国产| www.中文字幕在线观看 | 国产精品区一区二 | 欧美精品网址 | 依依成人在线 | 特级毛片在线播放 | 欧美不卡三区 | 精精国产xxxx视频在线播放 | 日韩女优一区二区 | 在线观看黄色网 | 91网站在线免费看 | 最全aⅴ番号库 | 中文字幕永久在线播放 | 国产一二三区在线视频 | 1000部国产精品成人观看 | 激情五月五月婷婷 | 亚洲成年人在线 | 青青青手机在线视频 | 男生操女生在线观看 | 国产精品久久久av | 亚洲一区二区精品视频 | 日韩欧美色图 | feel性丰满白嫩嫩hd | 无遮挡aaaaa大片免费看 | 乳色吐息免费看 | 国产日韩一级片 | 国产女教师一区二区三区 | 91全免费 | 亚洲无圣光 | 女生抠逼视频 | 亚洲第一av网站 | 国产主播在线看 | 噜噜噜色 | 韩国三级hd中文字幕 | 精品一区二区三区电影 | 欧美另类自拍 | 国产成人精品毛片 | 亚洲乱熟女一区二区三区小说 | 少妇欧美激情一区二区三区 | 久热久操| 久久av网址| 91激情在线观看 | 99自拍偷拍视频 | 亚洲一二三不卡 | 国产午夜麻豆影院在线观看 | 色婷婷综合网 | 干老太太视频 | 亚洲一区免费 | 阿v天堂网| 国产激情在线观看 | 神马久久久久久久 | 亚洲欧美色图视频 | 特级黄色一级片 | 国产国产精品 | 日日草 | 精品日韩中文字幕 | 黄色毛毛片 | 992av| 男人添女人下部高潮视频 | 亚洲91网站 | www.色人阁.com | 日韩性网站 | 中文字幕一区不卡 | 国产免费久久久 | 92精品| 在线免费观看欧美大片 | 国产精品自产拍在线观看 | 激情文学综合网 | 午夜av在线| 深爱五月网| 人人草在线观看 | 国产suv精品一区二区三区 | 亚洲国产日韩欧美一区二区三区 | 国产精品久久久 | 亚洲色偷偷色噜噜狠狠99网 | 亚洲视频观看 | 精品乱子一区二区三区 | 精国产人伦一区二区三区 | 麻豆蜜臀| 欧美一区不卡 | heyzo亚洲| 欧美美女一区二区 | av777777| 国产成人久久精品77777综合 | 免费看黄色网址 | 丰满少妇被猛烈进入高清播放 | 人人草在线 | 日韩精品在线免费 | 男女一级片 |