1. 程式人生 > >ThinkPHP5.0框架下多對多關聯模型的增刪改查

ThinkPHP5.0框架下多對多關聯模型的增刪改查

現在有三個表

管理員表my_admin

角色表my_role

中間表my_admin_role

SET FOREIGN_KEY_CHECKS=0;
SET NAMES 'utf8';




-- ----------------------------
-- Table structure for `my_admin`
-- ----------------------------
DROP TABLE IF EXISTS `my_admin`;
CREATE TABLE `my_admin` (
  `id` smallint(6) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL COMMENT '管理員名稱',
  `password` varchar(32) NOT NULL COMMENT '登入密碼',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態  -1:已刪除  0:禁用   1:正常',
  `email` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `create_id` smallint(6) DEFAULT NULL COMMENT '建立人id',
  `create_time` int(11) DEFAULT NULL COMMENT '建立時間',
  `last_modified_id` smallint(6) DEFAULT NULL COMMENT '最後修改人id',
  `last_modified_time` int(11) DEFAULT NULL COMMENT '最後修改時間',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for `my_admin_role`
-- ----------------------------
DROP TABLE IF EXISTS `my_admin_role`;
CREATE TABLE `my_admin_role` (
  `id` smallint(6) NOT NULL AUTO_INCREMENT,
  `admin_id` smallint(6) NOT NULL COMMENT '管理員ID',
  `role_id` smallint(6) NOT NULL COMMENT '角色id',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for `my_role`
-- ----------------------------
DROP TABLE IF EXISTS `my_role`;
CREATE TABLE `my_role` (
  `id` smallint(6) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '角色名稱',
  `pid` smallint(6) DEFAULT NULL COMMENT '父角色id',
  `sort` smallint(6) DEFAULT NULL COMMENT '排序',
  `create_id` smallint(6) DEFAULT NULL COMMENT '建立人id',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態  -1:已刪除  0:禁用   1:正常',
  `create_time` int(11) DEFAULT NULL COMMENT '建立時間',
  `last_modified_id` smallint(6) DEFAULT NULL COMMENT '最後修改人id',
  `last_modified_time` int(11) DEFAULT NULL COMMENT '最後修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

這樣設計是方便一個管理員可以有多個角色,角色之間也有層級關係,每一個父級角色在包含子角色時,自己也可以對應一組管理員

在model中定義兩個類,Admin 和 Role

<?php
namespace app\common\model;

use think\Model;

class Admin extends Model {
    protected $table = 'my_admin';


    public function role() {
        return $this->belongsToMany( 'role','my_admin_role' );
    }

    public function getStatusAttr($value) {
        $status = [
            '0' => '禁用',
            '1' => '啟用'
        ];
        return $status[ $value ];

    }
}
<?php
namespace app\common\model;

use think\Model;

class Role extends Model {
    protected $table = 'my_role';


    public function admin() {
        return $this->belongsToMany('admin','my_admin_role');
    }
}

注意這裡的第二個引數是完全的中間表名,要帶上字首的

1、查詢

在控制器Index中

查詢角色時,同時查出所有的管理員,注意此時得到的是一個物件陣列

<?php
    namespace app\admin\controller;

    class Index extends Base {

        public function index() {
            //查詢角色ID為1的所有管理員
            $role = model('role')->get(1);
            $admins = $role->admin;
            dump($admins);
        }

    }
查詢管理員時,查出次管理員的所有角色,得到的同樣是一個物件陣列
<?php
    namespace app\admin\controller;

    class Index extends Base {

        public function index() {
            //查詢ID為1的管理員的所有角色
            $admin = model('admin')->get(1);
            $role = $admin->role;
            dump($role);
        }

    }

這裡查出的都是物件的陣列,取出其中的某一項,可以得到其屬性


2、新增

<?php
    namespace app\admin\controller;

    class Index extends Base {

        public function index() {
            $admin = model('admin')->get(1);
            
            //新增一條
            $admin->role()->save([
                'name' => '超級管理員',
                'pid'  => 0,
            ]);
            
            //新增多條
            $admin->role()->saveAll([
                [
                    'name' => '版主',
                    'pid'  => 0,
                ],
                [
                    'name' => '體育欄目版主',
                    'pid'  => 1,
                ],
                [
                    'name' => '娛樂欄目版主',
                    'pid'  => 1,
                ],
            ]);
        }

    }

在role表和admin_role表中會同時自動生成新的資料

3、只更新中間表

<?php
    namespace app\admin\controller;

    class Index {

        public function index() {
            $admin = model('admin')->get(1);

            //中間表新增
            $admin->role()->attach([1,2,3,5,6]);
        
            //中間表刪除
            $admin->role()->detach([2,3,4,5]);
        }

    }
在修改多選時,可以將新增的attach(),將要刪掉的detach()