ThinkPHP5——模型關聯(一對多關聯)


關聯定義

一對多關聯的情況也比較常見,使用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();    

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM