thinkphp5中關(guān)聯(lián)模型的定義與使用方法

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

定義一對一關(guān)聯(lián)

這里假設(shè)你已經(jīng)把thinkphp5的環(huán)境都配置好了,數(shù)據(jù)庫也連接OK了。想通過模型把兩張表關(guān)聯(lián)起來然后在通過控制器一調(diào)用就可以得到兩張表的信息。

現(xiàn)在我準備了兩張表,一張管理員表pwn_admin一張管理員信息表pwn_admin_message 為了能更方便的理解我把兩張表的表結(jié)構(gòu)也貼出來了。

下面是兩張表的表結(jié)構(gòu)信息:

立即學習PHP免費學習筆記(深入)”;

CREATE TABLE `pwn_admin` (   `id` int(6) NOT NULL AUTO_INCREMENT,   `user` varchar(30) NOT NULL DEFAULT '',   `password` varchar(50) NOT NULL DEFAULT '',   `name` varchar(50) NOT NULL DEFAULT '',   PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
CREATE TABLE `pwn_admin_message` (   `id` int(6) NOT NULL AUTO_INCREMENT,   `email` varchar(30) NOT NULL DEFAULT '',   `mobile` varchar(50) NOT NULL DEFAULT '',   `aid` int(11) NOT NULL DEFAULT '',   PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

建模型文件

接下來是新建對應(yīng)兩張數(shù)據(jù)表的模型類文件。在模塊下新建一個model目錄然后新建兩個文件并按對應(yīng)的表命名:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

模型命名

模型類的命名規(guī)則是除去表前綴的數(shù)據(jù)表名稱,采用駝峰法命名,并且首字母大寫,比如上面兩張表的表前綴是pwn_ 在模型名稱里就需要省略掉。所以pwn_admin 表的模型類名就是 Admin ,pwn_admin_message 的模型類名就是AdminMessage

hasOne方法的參數(shù)包括:

hasOne(‘關(guān)聯(lián)模型名’,’外鍵名’,’主鍵名’,[‘模型別名定義’],’join類型’);

默認的join類型為INNER

模型定義

Admin模型對應(yīng)的是 pwn_admin 表

<?php namespace appindexmodel;  use thinkModel; class Admin extends Model{      function AdminMessage(){         //aid為外鍵id是adminmessage表關(guān)聯(lián)admin表的外鍵         //id是 admin表的主鍵         return $this->hasOne('AdminMessage','aid','id')-&gt;field('id,coltype,auth,name,intro,xuhao,pid,pname'); ????} }   ?&gt;

在Admin模型定義好關(guān)聯(lián)的方法之后在AdminMessage模型里可以不用寫任何對應(yīng)的方法,但是必須最少要有一個對應(yīng) pwn_admin_message 表的空模型。
相應(yīng)的如果在這個模型里寫了

<?php namespace appindexmodel;  use thinkModel; class AdminMessage extends Model{   } ?>

有一點需要注意的是,關(guān)聯(lián)方法的命名規(guī)范是駝峰法,而關(guān)聯(lián)屬性則一般是小寫+下劃線的方式,系統(tǒng)在獲取的時候會自動轉(zhuǎn)換對應(yīng),讀取user_profile關(guān)聯(lián)屬性則對應(yīng)的關(guān)聯(lián)方法應(yīng)該是userProfile。

控制器調(diào)用

在控制器想要使用關(guān)聯(lián)模型就需要先引入模型類,比如我上面是在admin模型里定義了關(guān)聯(lián)的方法,就需要把admin模型引入控制器。

use appindexmodelAdmin

<?php namespace appindexcontroller; use thinkController; use appindexmodelAdmin;  class Index extends Controller {     /**      * @param string $name      */     public function index($name=&#39;name&#39;)     {         //get 1 是獲取id為 1 的數(shù)據(jù)         //find() 是查找         //toArray()  是獲取到的數(shù)據(jù)轉(zhuǎn)為數(shù)組        $admin= Admin::get(1);     var_dump($admin->find()-&gt;toArray()); ????} ?????&gt;

運行結(jié)果:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

如果你的結(jié)果是這樣只有admin管理員表的數(shù)據(jù),別著急這是正常的。如果想要獲取到關(guān)聯(lián)表pwn_admin_message 的數(shù)據(jù)就需要先調(diào)用剛才定義的 AdminMessage() 模型方法,然后在指向find()方法取出數(shù)據(jù)。

注意:

這個find()方法是不可以省略掉的哦,我就是因為這個方法沒加上所以一直不能取出完整的管理員信息。

<?php namespace appindexcontroller; use thinkController; use appindexmodelAdmin;  class index extends Controller {     /**      * @param string $name      */     public function index($name=&#39;name&#39;)     {        $admin= Admin::get(1);        //查詢出pwn_admin_message 表aid為 1 的一條數(shù)據(jù),然后轉(zhuǎn)數(shù)組。        $admin= $admin->AdminMessage-&gt;find()-&gt;toArray();?? ????????var_dump($admin); ????????} ????} ???&gt;

得到的結(jié)果是:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

因為是測試為了方便我就不用數(shù)字號碼了,直接用文字代號這樣比較直觀明了。

hasWhere()方法:

如果要根據(jù)關(guān)聯(lián)表的查詢條件查詢當前模型的數(shù)據(jù),可以使用hasWhere方法,例如:

<?php namespace appindexcontroller; use thinkController; use appindexmodelAdmin;  class index extends Controller {     /**      * @param string $name      */     public function index($name=&#39;name&#39;)     {         $admin=Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;email&#39;=>'guanliB@ggg.com']); ????????$admin=$admin-&gt;find()-&gt;toArray(); ????????var_dump($admin); ????} ???} ?????&gt;

輸出結(jié)果:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

定義一對多關(guān)聯(lián)

一對多的關(guān)聯(lián)和一對一的關(guān)聯(lián)的使用差不多都是一樣的,區(qū)別是方法名不同。一對多在模型里使用的方法名是?hasMany?。hasMany 和 hasOne 的使用方法和參數(shù)基本相同。

hasMany參數(shù)是:

hasMany(‘關(guān)聯(lián)模型名’,’外鍵名’,’主鍵名’,[‘模型別名定義’]);

還是以上面兩張表為例,但是為了配合一對多關(guān)聯(lián) pwn_admin_message 的內(nèi)容還有aid 字段需要稍微修改一下。改成一個管理員有多個手機號,有多個email郵箱。

為了方便理解我把兩張表的數(shù)據(jù)內(nèi)容截圖上來。

下圖是 pwn_admin_message 表的內(nèi)容:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

下圖是 pwn_admin 表的內(nèi)容:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

有幾個管理員沒有數(shù)據(jù),不過沒關(guān)系足夠測試就可以了。好了廢話不多說,開始進入正題。
相信大家一看就知道下面這個是admin模型的內(nèi)容,對應(yīng)的是pwd_admin 表

?<?php namespace appindexmodel;  use thinkModel; class Admin extends Model{   public   function AdminMessage(){         //pid為外鍵id是adminmessage表關(guān)聯(lián)admin表的外鍵         //id是 admin表的主鍵         return $this->hasMany('AdminMessage','aid','id'); ????} }

而這下面這個是 AdminMessage 對應(yīng)的是哪張表我就不說了。這和一對一關(guān)聯(lián)一樣也可以是個空模型

<?php namespace appindexmodel; use thinkModel;  class AdminMessage extends Model{     /*         function Admin(){       return $this->belongsTo('Admin','aid','id'); ????} ????*/ } ?&gt;

控制器調(diào)用,這回就有點不一樣了。因為返回的數(shù)據(jù)是一個二維數(shù)組里面包含了多個對象所以需要把數(shù)組循環(huán)出來并把對象在轉(zhuǎn)為數(shù)組才能輸出

<?php namespace appindexcontroller; use thinkController; use appindexmodelAdmin;  class index extends Controller {     /**      * @param string $name      */     public function index($name=&#39;name&#39;)     {        $admin= Admin::get(1);        //查找出 pwn_admin_message 表關(guān)聯(lián)aid為1是所有數(shù)據(jù)        $admin= $admin->AdminMessage()-&gt;select(); ????????for($i=0;$i<count>toArray()); ????????} ????} } ?&gt;</count>

輸出結(jié)果:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

還有兩個函數(shù)也順便說一下了,一個是?hasWhere?還有一個?has?這兩個都是根據(jù)關(guān)聯(lián)條件來查詢的,通俗點講就是根據(jù)關(guān)聯(lián)到 pwd_admin 表,的 pwn_admin_message 表字段的條件來查詢的。如果換過來用pwd_admin里的字段作為條件查詢的話就會報錯。

<?php namespace appindexcontroller; use thinkController; use appindexmodelAdmin;  class index extends Controller {     /**      * @param string $name      */     public function index($name=&#39;name&#39;)     {      //  $admin= Admin::get(1);      $list= Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;aid&#39;=>1])-&gt;select(); ?????$list1=Admin::has('AdminMessage',['aid'=&gt;2])-&gt;select(); ????var_dump($list1[0]-&gt;toArray()); ????} ???}  ????&gt;

這樣子關(guān)聯(lián)得出的結(jié)果是正常的:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法如果按 pwd_admin 表的字段做為搜索條件就會報錯。比如我用一個 pwn_admin_message 沒有的字段,用user字段來做為條件查詢試試。

<?php namespace appindexcontroller; use thinkController; use appindexmodelAdmin;  class index extends Controller {     /**      * @param string $name      */     public function index($name=&#39;name&#39;)     {      //  $admin= Admin::get(1);     // $list= Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;aid&#39;=>1])-&gt;select(); ?????$list1=Admin::has('AdminMessage',['user'=&gt;'jiehechen123'])-&gt;select(); ?????var_dump($list1[0]-&gt;toArray()); ????} ???} ???&gt;

就會報出如下錯誤:

thinkphp5中關(guān)聯(lián)模型的定義與使用方法

推薦教程:thinkphp教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊8 分享