定義一對一關聯
這裡假設你已經把thinkphp5的環境都配置好了,資料庫也連接OK了。想透過模型把兩張表關聯起來然後在通過控制器一調用就可以得到兩張表的資訊。
現在我準備了兩張表,一張管理員表pwn_admin一張管理員資訊表pwn_admin_message 為了能更方便的理解我把兩張表的表結構也貼出來了。
下面是兩張表格的表格結構資訊:
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;
建置模型檔案
接下來是新建對應兩張資料表的模型類別檔案。在模組下新建一個model目錄然後新建兩個檔案並按對應的表命名:
#模型命名
模型類別的命名規則是除去表前綴的資料表名稱,採用駝峰法命名,並且首字母大寫,例如上面兩張表的表前綴是pwn_ 在模型名稱裡就需要省略掉。所以pwn_admin 表的模型類別名稱就是Admin ,pwn_admin_message 的模型類別名稱就是AdminMessage
hasOne方法的參數包括:
hasOne('關聯模型名稱','外鍵名稱','主鍵名',['模型別名定義'],'join型別');
預設的join型別為INNER
模型定義
Admin模型對應的是pwn_admin 表
<?php namespace app\index\model; use think\Model; class Admin extends Model{ function AdminMessage(){ //aid为外键id是adminmessage表关联admin表的外键 //id是 admin表的主键 return $this->hasOne('AdminMessage','aid','id')->field('id,coltype,auth,name,intro,xuhao,pid,pname'); } } ?>
在Admin模型定義好關聯的方法之後在AdminMessage模型裡可以不用寫任何對應的方法,但是必須最少要有一個對應pwn_admin_message 表的空模型。
對應的如果在這個模型裡寫了
<?php namespace app\index\model; use think\Model; class AdminMessage extends Model{ } ?>
有一點需要注意的是,關聯方法的命名規範是駝峰法,而關聯屬性則一般是小寫下劃線的方式,系統在獲取的時候會自動轉換對應,讀取user_profile關聯屬性則對應的關聯方法應該是userProfile。
控制器呼叫
在控制器想要使用關聯模型就需要先引入模型類別,比如我上面是在admin模型裡定義了關聯的方法,就需要把admin模型引入控制器。
use app\index\model\Admin
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class Index extends Controller { /** * @param string $name */ public function index($name='name') { //get 1 是获取id为 1 的数据 //find() 是查找 //toArray() 是获取到的数据转为数组 $admin= Admin::get(1); var_dump($admin->find()->toArray()); } ?>
運行結果:
如果你的結果是這樣只有admin管理員表的數據,別著急這是正常的。如果想要取得到關聯表pwn_admin_message 的資料就需要先呼叫剛才定義的 AdminMessage() 模型方法,然後在指向find()方法取出資料。
注意:
這個find()方法是不可以省略掉的哦,我就是因為這個方法沒加上所以一直無法取出完整的管理員資訊。
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin= Admin::get(1); //查询出pwn_admin_message 表aid为 1 的一条数据,然后转数组。 $admin= $admin->AdminMessage->find()->toArray(); var_dump($admin); } } ?>
得到的結果是:
因為是測試為了方便我就不用數字號碼了,直接用文字代號這樣比較直觀明了。
hasWhere()方法:
如果要根據關聯表的查詢條件查詢當前模型的數據,可以使用hasWhere方法,例如:
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin=Admin::hasWhere('AdminMessage',['email'=>'guanliB@ggg.com']); $admin=$admin->find()->toArray(); var_dump($admin); } } ?>
輸出結果:
定義一對多關聯
一對多的關聯和一對一的關聯的使用差不多都是一樣的,差異是方法名稱不同。一對多在模型裡使用的方法名稱是 hasMany 。 hasMany 和 hasOne 的使用方法和參數基本上相同。
hasMany參數是:
hasMany('關聯模型名稱','外鍵名稱','主鍵名稱',['模型別名定義']);
還是以上面兩張表為例,但為了配合一對多關聯pwn_admin_message 的內容還有aid 欄位需要稍微修改一下。改成一個管理員有多個手機號,有多個email信箱。
為了方便理解我把兩張表的資料內容截圖上來。
下圖是 pwn_admin_message 資料表的內容:
#下圖是 pwn_admin 資料表的內容:
#有几个管理员没有数据,不过没关系足够测试就可以了。好了废话不多说,开始进入正题。
相信大家一看就知道下面这个是admin模型的内容,对应的是pwd_admin 表
<?php namespace app\index\model; use think\Model; class Admin extends Model{ public function AdminMessage(){ //pid为外键id是adminmessage表关联admin表的外键 //id是 admin表的主键 return $this->hasMany('AdminMessage','aid','id'); } }
而这下面这个是 AdminMessage 对应的是哪张表我就不说了。这和一对一关联一样也可以是个空模型
<?php namespace app\index\model; use think\Model; class AdminMessage extends Model{ /* function Admin(){ return $this->belongsTo('Admin','aid','id'); } */ } ?>
控制器调用,这回就有点不一样了。因为返回的数据是一个二维数组里面包含了多个对象所以需要把数组循环出来并把对象在转为数组才能输出
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin= Admin::get(1); //查找出 pwn_admin_message 表关联aid为1是所有数据 $admin= $admin->AdminMessage()->select(); for($i=0;$i<count($admin);$i++){ var_dump($admin[$i]->toArray()); } } } ?>
输出结果:
还有两个函数也顺便说一下了,一个是 hasWhere 还有一个 has 这两个都是根据关联条件来查询的,通俗点讲就是根据关联到 pwd_admin 表,的 pwn_admin_message 表字段的条件来查询的。如果换过来用pwd_admin里的字段作为条件查询的话就会报错。
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { // $admin= Admin::get(1); $list= Admin::hasWhere('AdminMessage',['aid'=>1])->select(); $list1=Admin::has('AdminMessage',['aid'=>2])->select(); var_dump($list1[0]->toArray()); } } ?>
这样子关联得出的结果是正常的:
如果按 pwd_admin 表的字段做为搜索条件就会报错。比如我用一个 pwn_admin_message 没有的字段,用user字段来做为条件查询试试。
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { // $admin= Admin::get(1); // $list= Admin::hasWhere('AdminMessage',['aid'=>1])->select(); $list1=Admin::has('AdminMessage',['user'=>'jiehechen123'])->select(); var_dump($list1[0]->toArray()); } } ?>
就会报出如下错误:
推荐教程:thinkphp教程
以上是thinkphp5中關聯模型的定義與使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!