定義一對一關聯
這裡假設你已經把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');
}
}
?>
對應的如果在這個模型裡寫了
<?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 資料表的內容:
#######下圖是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()); } } ?>
就会报出如下错误:
推荐教程:《TP5》
以上是thinkphp關聯模型的定義與使用方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!