關聯定義
一對多關聯的情況也比較常見,使用hasMany
方法定義,參數包括:
hasMany('關聯模型名','外鍵名','主鍵名',['模型別名定義']);
例如租客表和宿舍表,一個宿舍有多個租客,宿舍和租客一對多的關系,表結構如下:
#宿舍 CREATE TABLE `apartment` ( `apar_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '編號', `apar_name` varchar(40) DEFAULT NULL COMMENT '名稱', `apar_type` varchar(20) DEFAULT NULL COMMENT '類型', `apar_price` varchar(30) DEFAULT NULL COMMENT '價格', `apar_sum` int(11) DEFAULT NULL COMMENT '床數', PRIMARY KEY (`apar_id`) ) COMMENT='宿舍'; #租客 CREATE TABLE `client` ( `cli_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '編號', `aid` int(11) DEFAULT NULL COMMENT '外鍵', #房間 `cli_name` varchar(20) DEFAULT NULL COMMENT '姓名', `cli_sex` varchar(20) DEFAULT NULL COMMENT '性別', `cli_phone` varchar(40) DEFAULT NULL COMMENT '電話', `cli_identity` varchar(50) DEFAULT NULL COMMENT '身份證', `cli_reservation` varchar(40) DEFAULT NULL COMMENT '預定房間', PRIMARY KEY (`cli_id`), KEY `Apar_id` (`aid`), CONSTRAINT `client_ibfk_1` FOREIGN KEY (`aid`) REFERENCES `apartment` (`apar_id`) ) COMMENT='租客';
宿舍表的模型用hasMany方法,這樣已經關聯租客表:
<?php namespace app\demo\model; use think\Model; //宿舍 class Apartment extends Model { //定義關聯方法 public function comm(){ //hasMany('租客表名','租客表外鍵','宿舍主鍵',['模型別名定義']); return $this->hasMany('client','aid','apar_id'); } }
關聯查詢
我們可以通過下面的方式獲取關聯數據:
//方法一:這個需要調用$apr->comm才查顧客表 $apr = Apartment::get(1); $apr->comm;//注意這里不加括號 //方法二:不用調用$apr->comm,預先查租客表 $apr = Apartment::get(1,'comm');
注:comm是一個屬性,這里先執行comm()把里面的租客信息封裝到comm;comm()是關聯模型,comm返回是租客的信息
根據關聯條件查詢
//根據關聯條件查詢 $apr = Apartment::get(1); $data = $apr->comm()->where('cli_name','陳芬')->select(); print_r($data); //或者使用getBy $apr = Apartment::get(1); $data = $apr->comm()->getByCliName('陳芬'); print_r($data);
關聯聚合查詢
//聚合查詢,默認查詢宿舍的租客人數'>='1的宿舍 $apr = Apartment::has('comm')->select(); //查詢宿舍的租客人數'>='3的宿舍 $apr = Apartment::has('comm','>=','3')->where('apar_name','410')->select(); print_r($apr);
也可以查詢全部宿舍和全部租客相關聯的信息 ,如下:
//方法一:獲取全部數據 $apr = Apartment::all(); foreach ($apr as $list) { //$list->comm封裝全部租客的信息,一個宿舍有多個租客 foreach ($list->comm as $ac){ echo "姓名:{$ac->cli_name},房號:{$list->apar_name}<br>"; } } //方法二:使用關聯預查詢功能,有效提高性能。 $apr = Apartment::with('comm')->select(); foreach ($apr as $list) { //$list->comm封裝全部租客的信息,一個宿舍有多個租客 foreach ($list->comm as $ac){ echo "姓名:{$ac->cli_name},房號:{$list->apar_name}<br>"; } }
關聯新增
//新增,添加一位租客 $apr = Apartment::get(1); $cli = new Client(); $cli->cli_name = "小唐"; $cli->cli_sex = '男'; $cli->cli_phone='1315***'; $cli->cli_identity='4487654334567610'; $cli->cli_reservation='沒有'; $apr->comm()->save($cli);
如果想批量新增,如下:
//批量新增租客
$apr = Apartment::get(2); $cli = [ ["cli_name"=>'阿K','cli_sex'=>'男','cli_phone'=>'1315***','cli_identity'=>'448***','cli_reservation'=>'沒有'], ["cli_name"=>'小胡','cli_sex'=>'男','cli_phone'=>'1315***','cli_identity'=>'448***','cli_reservation'=>'沒有'] ]; $apr->comm()->saveAll($cli);
關聯更新
//更新 $apr = Apartment::get(1); $comm = $apr->comm()->getByCliName('陳楊文'); $comm->cli_name='楊文'; $comm->save(); //或者通過update方法更新 $apr = Apartment::get(1); $apr->comm()->where('cli_id',5)->update(['cli_name'=>'陳楊文']);
關聯刪除
//刪除id為13的租客 $apr = Apartment::get(2); $comm = $apr->comm()->getByCliId(13); $comm->delete(); //刪除所有的關聯數據 $apr = Apartment::get(2); $apr->$comm()->delete();