ThinkPHP5.0框架下多對多關聯模型的增刪改查
阿新 • • 發佈:2019-01-27
現在有三個表
管理員表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()